反弹跟踪保护¶
反弹跟踪保护 (BTP) 是 Gecko 中的一项反跟踪功能,它基于一组启发式方法检测反弹跟踪器(导航跟踪)。与Cookie 清理功能不同,它不依赖于跟踪器列表,这使其更易于与 Web 兼容,同时也能涵盖未知的反弹跟踪器。
标准化¶
该保护措施是 PrivacyCG 的一项工作内容。Gecko 中的实现严格遵循反弹跟踪缓解规范草案。
Mozilla 还有一个关于反弹跟踪缓解的规范立场。
行为¶
BTP 通过查看导航时间来检测反弹跟踪器。它建立了扩展导航的概念,该概念可以包含一系列短暂的重定向。这些短暂的重定向通常由反弹跟踪器使用。如果某个站点在如此短暂的重定向中访问 Cookie 或存储,则将其添加到分类列表中。已分类的反弹跟踪器的 Cookie、站点数据和缓存会定期清除。为了避免误报和清除可能对用户重要的数据,在过去 45 天内用户直接与之交互过的站点将免于被分类或清除。
请参阅反弹跟踪缓解说明,以获取有关该功能以及如何对跟踪器进行分类的更详细(尽管以 Chromium 为中心)的描述。
Gecko 实现¶
Gecko 实现的工作内容由以下元 Bug 跟踪:Bug 1839915 - [meta] 反弹跟踪保护。
首选项¶
可以使用 privacy.bounceTrackingProtection.*
首选项启用该功能并调整其行为。请参阅StaticPrefList.yaml,获取包含描述的首选项列表。
主要功能首选项是 privacy.bounceTrackingProtection.mode
,其中 0
表示完全禁用,1
表示完全启用。请参阅nsIBounceTrackingProtection.idl,获取完整选项列表。
日志记录¶
BTP 具有一个日志记录器,可以通过使用 MOZ_LOG
环境变量启动 Firefox 来启用它。使用 MOZ_LOG=BounceTrackingProtection:5
对每次导航进行详细日志记录,使用 MOZ_LOG=BounceTrackingProtection:3
进行更简洁的日志记录,重点关注分类和清除。
测试¶
在测试站点以确保它们不会因反弹跟踪行为而被清除时,您可以同时使用日志记录(如上所述)来观察分类,并通过浏览器工具箱直接调用该功能以提前触发清除。
您还可以检查开发者工具控制台中的警告消息,这些消息将在站点被分类时记录。例如
“bounce-tracking-demo-tracker-server.glitch.me”已被分类为反弹跟踪器。如果它在接下来的 3600 秒内未收到用户激活,则其状态将被清除。
以下部分中的代码段需要在浏览器工具箱中执行。请注意,虽然工具箱看起来像常规的开发者工具,但它是一个用于调试 Firefox 本身而非网站的特殊控制台。
打印已分类的反弹跟踪器列表¶
要获取当前所有已分类的反弹跟踪器的列表,请使用以下代码段
await Cc[
"@mozilla.org/bounce-tracking-protection;1"
].getService(Ci.nsIBounceTrackingProtection).testGetUserActivationHosts({})
这将打印排除私人浏览和标签容器的列表。对于这些,您需要传入一个 OriginAttributes
对象。请参阅nsIBounceTrackingProtection,获取更多文档。
已被清除或收到用户交互的站点会自动从该列表中移除。
请注意,仅仅因为某个站点在该列表中并不意味着它会被分类。一旦分类,就会有一个 1 小时的宽限期,在此期间站点可能会收到用户交互。如果用户在该时间窗口内与站点交互,则该站点将从反弹跟踪器列表中移除,并在 45 天内免于清除。
触发所有已分类跟踪器的清除:¶
在导航到站点之前,将 privacy.bounceTrackingProtection.bounceTrackingGracePeriodSec
设置为 0
或较小的数字。这控制站点在(分类)反弹后多快被清除。如果您不更新此首选项,则需要等待最多 1 小时才能清除站点。
清除通常每小时运行一次。要手动触发清除,可以使用以下代码段
await Cc[
"@mozilla.org/bounce-tracking-protection;1"
].getService(Ci.nsIBounceTrackingProtection).testRunPurgeBounceTrackers();
返回值将是被清除的站点数组。请注意,清除适用于整个域名 (eTLD+1)。
测试页面¶
https://bounce-tracking-demo.glitch.me/ 是一个演示页面,其中包含两个显示反弹跟踪行为的链接。您可以结合上述方法使用它来验证机制是否正在运行。