written by
Just4test

为何浏览器厂商不允许禁用链接审计

1 min read , April 24, 2019

链接审计(hyperlink auditing)是一种新的web特性,用于收集用户点击链接的行为,通常用于跨站点跳转的链接。如下代码是一个带有链接审计的超链接:

<a href="https://google.com" ping="/ping">Google</a>

在用户点击该链接时,浏览器会跳转到google.com,同时向/ping路径发送一个请求。这样当前站点就会得知用户点击了该链接。这是一种用户跟踪行为,因此那些率先实现了链接审计特性的浏览器——例如Chrome——曾经允许用户通过一个隐藏设置禁用跟踪行为。

然而现在大部分浏览器厂商不再允许用户禁用链接审计,比如Chrome、Safari、OperaFirefox会在支持链接审计后默认启用该特性。浏览器厂商声称,虽然他们致力于保护用户隐私,但允许用户禁用链接审计将无助于隐私问题,反而会降低页面性能。这听起来似乎不太合乎常理。

各个网站很早就在收集用户点击外链的行为。Google是个典型代表,其在搜索结果页中的每一个条目都安放了收集功能。通过查看代码,可以看到其非常有趣的行为。在支持链接审计的Chrome 73中,Google直接使用了链接审计特性,如图:

换成尚不支持该特性的Firefox,实现要有趣得多,也复杂得多。在Firefox Nightly 68.0a1版本中,使用google.com搜索Google,鼠标指向第一个链接,浏览器左下角会显示其目标地址为google.cn,如图。

此时查看源代码(不要在该链接上右键审查元素),可以看到该链接的代码中有一个onmousedown的脚本。当用户在链接上按下鼠标时,脚本将触发,如图。

我们来试试onmousedown会做些什么事。在链接上右击,该链接的目标地址改变了,变成了https://www.google.com/url? ……,如图。

此时再用鼠标指向该链接,可以看到浏览器右下角的目标地址已经变化了,如图。

所以,当用户在搜索结果条目上点击鼠标时,浏览器就会依次执行“将链接替换为跟踪链接”、“跳转到跟踪链接”、“跳转到原始链接”这三个步骤,完成用户行为收集。

链接审计特性显著地简化了前端的代码量,但其并不是为了这个目的设计的,而是为了提高性能。传统方式被称为“二次跳转”,因为其先跳转到跟踪链接,再跳转到原始链接。浏览器在跳转到跟踪链接之前并不知道原始链接的地址,因此只能按顺序访问两个链接。大部分善于翻墙的中国用户对此感受颇深,因为google的跟踪链接访问起来非常慢。而链接审计则不然,虽然也会访问两个链接,但浏览器同时知道这两个链接的地址,因此可以同时访问,从而提升速度。

当网站使用链接审计特性时,浏览器能够禁止跟踪行为;当网站使用二次跳转方式时,浏览器无法禁止跟踪行为。网站自然是不愿意自己的功能被破坏的;因此当浏览器可能破坏链接审计功能时,网站的简单做法就是使用二次跳转,宁可不要链接审计带来的性能改进。这也就是为什么主流浏览器不再提供禁用选项的原因了。

一些小众浏览器和浏览器扩展仍然可以禁用链接审计。对于网站来说,如果这些作弊者的数量很有限,那么拥抱新技术也不坏。这是很有趣的一点:不按规则出牌的小众受益于大众的选择,即使二者的选择完全相反。这让我想到了注射疫苗:如果只有小部分人注射疫苗,那么没注射疫苗的人会有感染危险(网站为不同浏览器投放不同的跟踪代码,只有支持链接审计并且不能禁用的浏览器能从该特性中获益);大部分人都注射疫苗,流行病就无法广泛传播,从而使没有注射疫苗的人群受益(网站为所有用户启用链接审计特性,无视小众浏览器和作弊者,他们也受益于该特性)。

Chrome Broswer