重定向跟踪保护
自 79 版本以来,Firefox 一直通过定期清除已知跟踪器设置的 cookie 和站点数据来保护用户免受 重定向跟踪 的侵害。仅当用户 阻止跟踪 cookie(即 network.cookie.cookieBehavior 首选项设置为 4)时,才会从存储中清除这些数据。
对其他 cookie 策略的支持由 Bug 1643045 进行跟踪。
定义重定向跟踪
重定向跟踪是对跨站点导航的滥用,其中跟踪器会短暂地将用户重定向到其网站,目的是利用第一方存储来跨网站跟踪该用户。
跨站点导航是 Web 的核心功能;一个人可能会在搜索引擎中搜索“最佳跑鞋”,点击搜索结果阅读评论,最后点击链接从在线商店购买一双鞋。过去,这些网站都可以嵌入同一个跟踪器的资源,而跟踪器可以使用其 cookie 将所有这些页面访问链接到同一个人。为了保护用户的隐私,浏览器会阻止跟踪器在使用第三方上下文(例如,请参阅 Firefox 的 增强跟踪保护 (ETP))时使用 cookie,但仍允许它们作为第一方使用 cookie,因为阻止第一方 cookie 会导致网站出错。重定向跟踪利用了这一点来绕过第三方 cookie 阻止。
重定向跟踪器的工作方式是,在用户旅程的一部分中,强制用户在他们的网站上进行一次不可察觉的短暂停留。因此,您不会直接从评论网站导航到零售商,而是会先导航到重定向跟踪器,然后再导航到零售商。这意味着跟踪器作为第一方加载。重定向跟踪器将跟踪数据与他们存储在其第一方 cookie 中的标识符相关联,然后将您转发给零售商。
清除哪些源?
如果满足以下条件,将清除该源
- 在过去 72 小时内存储了 cookie 或访问了其他站点存储(例如,localStorage、IndexedDB 或 Cache API)。由于 cookie 是按主机划分的,我们将清除 cookie 主机的
http和https源变体。 - 该源在我们的跟踪保护列表中 被归类为跟踪器。
- 具有相同基本域(eTLD+1)的源没有用户交互权限。
- 当用户与来自该源的顶级文档进行交互时,将授予该源 45 天的此权限。“交互”包括滚动。
- 尽管此权限是按源级别存储的,但我们会检查具有相同基本域的任何源是否拥有此权限,以避免破坏具有子域和相应 cookie 设置的网站。
清除哪些数据?
Firefox 将清除 以下数据
- 网络缓存和图像缓存
- Cookie
- AppCache
- DOM 配额存储(localStorage、IndexedDB、ServiceWorkers、DOM 缓存等)
- DOM 推送通知
- Reporting API 报告
- 安全设置(例如 HSTS)
- EME 媒体插件数据
- 插件数据(例如 Flash)
- 媒体设备
- 授予源的存储访问权限
- HTTP 身份验证令牌
- HTTP 身份验证缓存
注意: 尽管我们正在清除所有这些数据,但目前仅当跟踪器使用 cookie 或其他站点存储时,我们才会将其标记为清除。
多久清除一次数据?
Firefox 根据名为 idle-daily 的内部事件的触发来清除存储,该事件由以下条件定义
- 它最早在上次
idle-daily事件触发后 24 小时触发。 - 仅当用户至少空闲 3 分钟(在上次
idle-daily事件后的 24-48 小时内)或 1 分钟(在上次idle-daily事件后的 >48 小时内)时才会触发。
这意味着每次存储清除之间至少有 24 小时,并且仅当浏览器空闲时才会清除存储。清除 cookie 时,我们会按创建日期对 cookie 进行排序,并出于性能原因将它们分批处理为 100 个一组(由首选项 privacy.purge_trackers.max_purge_count 控制)。
调试
可以通过在 about:config 中切换 privacy.purge_trackers.enabled 首选项来启用或禁用重定向跟踪保护。此外,仅当 Firefox 79+ 版本中 network.cookie.cookieBehavior 首选项设置为 4 或 5 时(Firefox 80 及更高版本设置为 1、3、4 或 5)才会运行。
可以通过 privacy.purge_trackers.logging.level 首选项设置不同的日志级别。
为了进行调试,最简单的方法是通过 浏览器控制台命令行 直接触发服务来触发存储清除。请注意,这与您可能用来调试网站的普通 Web 控制台 不同,并且需要将 devtools.chrome.enabled 首选项设置为 true 才能交互式使用。一旦启用了浏览器控制台,您就可以通过运行以下命令来触发存储清除
await Components.classes["@mozilla.org/purge-tracker-service;1"]
.getService(Components.interfaces.nsIPurgeTrackerService)
.purgeTrackingCookieJars();
可以使用 privacy.userInteraction.expiration 首选项将用户交互权限的过期时间设置为更短的持续时间。请注意,您必须在访问要测试的网站之前设置此首选项 — 它不会追溯适用。
其他实现
WebKit 在 ITP 2.0 中首次提供了重定向跟踪保护(他们将相同的攻击称为跳转跟踪)。截至 2020 年 7 月,WebKit 的实现与 Firefox 的实现之间存在一些显著差异
- Firefox 中要清除的源列表基于我们的 跟踪保护列表;WebKit 依赖于 ITP 的分类。
- Firefox 对“交互”的定义包括在将源作为第一方访问时进行用户滚动;WebKit 则不包括。
- 如果源在过去 45 个日历时间内作为第一方接收到交互,Firefox 将不会清除该源的数据;WebKit 的交互窗口是 30 天的浏览器使用时间(例如,用户至少与 Safari 交互过一次的日期)。