【试着科普了】关于我们常说的 url 中的跟踪参数

心血来潮在 Mastodon 上发的小科普,原帖在这里


看到跟踪参数的话题又被大家提到,试着写了一些科普。

不怎么会说人话,可能有不少语病。也好久没学习,可能有错漏。欢迎纠正(鞠躬)。


一个合法的 url 的组成结构如图(图片来自 https://developer.mozilla.org/en-US/docs/Learn/Common_questions/Web_mechanics/What_is_a_URL/mdn-url-all.png )。

What_is_a_URL

前面的部分就不详细展开了,简单来说,在浏览 web 时,domain 和 port 指明一台主机的地址(或者理解为一个站点),而 path 指向这个站点上的一个「页面」。


但是很多时候,能够指向一个页面还不够,还需要一些额外的参数。最常见的例子是,对于 Google 搜索,不同的关键词需要返回不同的结果。

又比如,有时网站的设计者不希望用 path 来指定到最详细的地址。例如一个b站用户可以频繁创建和删除收藏夹,因此这些页面相对来说比较「短命」;如果每个收藏夹都用唯一的 path 指向,从设计上来说就不太有美感。

因此,我们需要在 url 中引入「参数」机制来提供额外信息给服务器。这些参数(对应图中的 parameters )通常称为 query string 。它们附在一个 url 后面,由问号 ? 开始,每一个参数写成 key=value 的键值对形式,不同参数之间用 & 间隔。


我们可以试着在 Google 搜索「test query」,看看搜索结果页面的 url 是如何使用 query string 的:

https://www.google.com/search?client=firefox-b-d&q=test+query

按照结构来拆解,可以看到其中包括了两个参数:

  • client=firefox-b-d,是指所使用的浏览器 firefox;
  • q=test+query,就是要搜索的关键词 test 和 query,空格被转换为了加号。

你可能已经注意到了,这里的两个参数其实只有一个是必要的,那就是 q。删掉 client 之后,这个 url ( https://www.google.com/search?q=test+query )依然可以打开「test query」这一搜索结果页面。如果你实际在 Google Search 尝试以上步骤,可能你得到的 url 参数还要多得多,它们有些是人类可读的,有些看上去则是乱码。这些参数对于 Google 来说(大概)是有其用途的,但是当我们想分享这个 url 时,我们完全不需要这些参数,因为我们只是想让别人看到「test query」的搜索结果,仅此而已。


说回「跟踪参数」,它们其实就是网站往 url 的 query string 里塞的一些参数。这些参数可能包含各种各样的信息,some of which 我们不希望在分享时公开。如果这些参数足够 unique,那么它们就能够用来「跟踪」。例如:

  • 对于把 url 分享出去的人来说,最常见的风险是暴露自己的用户 id 。设想某人将站点 A 的 url 分享在站点 B 上,而该 url 中含有这位用户在站点 A 的用户 id ,那么所有看到这条分享的人都可以把这两个位于不同站点上的账户关联起来(e.g. 认定为同一人)。这个后果可以自行想象……

  • 对于看到然后打开 url 的人,常见的风险是网站能够得知你是怎么来到这个页面的。例如,如果生成的 url 指明了分享的目标平台是微博,那么网站就能知道用户大概率是在微博看到并点开了这个 url,从而推断该用户有在使用微博;如果 url 中含有分享用户的 id ,网站就能知道这两个用户有关联,它甚至可以从「用户 A 每周会打开十次用户 B 分享出去的链接」推断出用户 A 和用户 B 是好朋友。


至于分享时到底要删除哪些东西——总之首先读读它。似乎有人会觉得 url 是抽象的一串字符,但其实很多 url 是人类可读的,而且有用的信息通常都是人类可读的。例如,如果我要分享一个 YouTube 视频,https://www.youtube.com/watch?v=xxxxxx 就足够了,因为 v=xxxxxx 已经指定了视频的 id ;如果我要进一步分享一个视频的特定时间点,e.g. 两分十秒,那么参数就会多一个 t=130 。如果参数是一串乱七八糟看起来很随机还长得离谱的字符,那不要犹豫,删了它就是。如果实在不放心,可以试试删了之后再打开,看看能不能到达目标页面。


另外,如果一个 url 从 path 开始就已经看起来完全随机无从下手,例如 YouTube 点「Share」时生成的链接 https://youtu.be/w2a-fAs3F9b (我捏造的,但格式大概是这样没错,但也不要点进去), 那么它多半是个短链接了,这就又是另外的话题了。