category
状态分区是Mozilla的一项广泛努力,旨在重新设计Firefox管理客户端状态(即存储在浏览器中的数据)的方式,以减少网站滥用状态进行跨站点跟踪的能力,即通过third-party cookies.。
这项工作旨在通过为用户访问的每个网站提供分区存储位置来实现这一点。本文概述了该机制,列出了受影响的API,并解释了如何调试受影响的站点。
默认情况下,状态分区当前在Firefox Nightly频道中处于打开状态。自85版本以来,Firefox的发布通道默认启用了状态分区工作的一个子集(即网络分区)。
动机
使用共享状态进行跨站点跟踪
浏览器传统上根据资源加载位置的来源【origin】(有时是可注册的域)对客户端状态进行键入(key)。例如,从https://example.com/hello.html加载的iframe可用的cookie、localStorage对象和缓存将由example.com为键。无论浏览器当前是作为第一方资源还是作为嵌入的第三方资源从该域加载资源,这都是正确的。跟踪器利用这种跨站点状态来存储用户标识符并跨网站访问它们。下面的示例显示了example.com如何使用其跨站点状态(在本例中为cookie)在其自己的站点以及a.example和B.example中跟踪用户。
跨站点状态示例
过去阻止跨站点跟踪的方法
Firefox过去的cookie策略试图通过在某些条件下阻止某些域访问某些存储API(例如cookie和localStorage)来减轻跟踪。例如,我们的“阻止所有第三方cookie”策略将阻止所有域在第三方上下文中加载时访问某些存储API。我们当前的默认cookie策略仅阻止分类为跟踪器的域在第三方上下文中访问。
状态划分
状态分区是防止跨站点跟踪的另一种方法。Firefox并没有在第三方环境中阻止对某些有状态API的访问,而是为每个顶级网站提供了一个单独的存储桶作为嵌入式资源。更具体地说,Firefox通过加载资源的来源和顶级站点对所有客户端状态进行双重键控。在大多数情况下,顶级网站是用户访问的顶级页面的scheme和eTLD+1。
在下面的示例中,example.com嵌入在A.example和B.example中。但是,由于存储是分区的,因此存在三个不同的存储桶(而不是一个)。跟踪器仍然可以访问存储,但由于每个存储桶都是在顶级网站下额外键入的,因此它在A上可以访问的数据将与在B上访问的数据不同。这将防止跟踪器在直接访问时将标识符存储在其cookie中,然后在嵌入其他网站时检索该标识符。
状态划分的示例
标准化
Privacy Community Group有一个用于客户端存储分区的工作项。这是对受影响的各个标准中存储分区标准化工作的概述。随着工作项的标准化,我们打算将我们的状态划分实现与这些工作保持一致。
Firefox中分区的状态
- Network Partitioning: Enabled by default for all users since Firefox 85.
- Dynamic State Partitioning:
- Since Firefox 86: Enabled for users that have "Strict" privacy protections enabled.
- Since Firefox 90: Enabled in private browsing.
静态分区
存储分区
为了防止JavaScript可访问存储API用于跨站点跟踪,可访问存储按顶级站点进行分区。这种机制意味着,通常情况下,嵌入一个顶级网站的第三方无法访问存储在另一个顶级站点下的数据。
存储API
网络分区
与网络相关的API不用于网站存储数据,但它们可能被滥用用于跨站点跟踪。因此,以下网络API和缓存由顶级站点永久分区。
注意:网络分区是永久性的。网站无法控制或放松这些限制。
网络API
- HTTP Cache
- Image Cache
- Favicon Cache
- Connection Pooling
- Stylesheet Cache
- DNS
- HTTP Authentication
- Alt-Svc
- Speculative Connections
- Fonts & Font Cache
- HSTS
- OCSP
- Intermediate CA Cache
- TLS Client Certificates
- TLS Session Identifiers
- Prefetch
- Preconnect
- CORS-preflight Cache
- WebRTC deviceID
动态分区
通常,如果可访问的存储按顶级站点分区,则如果支持存储访问API,则仍然可以授予对第三方未分区cookie的访问权限:
- 使用存储访问API。
- 自动地,例如对于提供联合登录的第三方。
存储访问启发部分提供了有关自动授予的详细信息。
动态分区的API
存储访问启发法
为了提高网络兼容性,Firefox目前包括一些启发式方法,自动向接收用户交互的第三方授予对cookie的未分区访问权限。这些启发法旨在允许网络上常见的一些第三方集成继续发挥作用。
警告:存储访问启发法是一种过渡性功能,旨在防止网站崩溃。当前和未来的网络开发不应依赖它们。
开放式启发式
- 当分区的第三方打开一个弹出窗口,该窗口具有对原始文档的开启者访问权限时,第三方将被授予对其嵌入程序的存储访问权限30天。
- 当第一方a.example打开第三方弹出窗口b.example时,b.example被授予对a.example的第三方存储访问权限30天。
注意:对于滥用这些启发式方法进行跟踪的第三方,我们可能需要用户在授予存储访问权限之前与弹出窗口进行交互。
重定向启发式
- 如果站点b.example重定向到a.example,那么b.example接收到对其嵌入程序a.example的存储访问,如果a.example和b.example在过去10分钟内都被访问并进行了交互。此存储访问权限将被授予15分钟。
- 如果跟踪器tracker.example(按增强跟踪保护分类)重定向到非跟踪器a.example,并且tracker.example在过去45天内作为第一方接收到用户交互,则tracker.example被授予对a.example的存储访问权限15分钟。
存储访问API
第三方框架可以使用document.requestStorageAccess通过Storage access API请求对cookie的未分区访问。一旦获得批准,请求方将获得对其整个第一方cookie的访问权限(即,如果作为第一方访问,则可以访问的cookie)。
警告:授予存储访问权时,可能仍有对分区存储的引用。然而,网站不应该依赖于能够同时使用分区和未分区的cookie。
调试
我们鼓励网站所有者测试他们的网站,特别是那些依赖第三方内容集成的网站。Firefox中有几个功能可以使测试更容易。
Logging
以下是在第三方上下文中与存储交互时记录到web控制台的消息的概述。在以下示例中,a.example是嵌入第三方框架b.example的顶级站点。
Reason | Console Message |
---|---|
Storage of a third-party frame is partitioned | Partitioned cookie or storage access was provided to "b.example" because it is loaded in the third-party context and storage partitioning is enabled. |
Access to unpartitioned cookies is granted through Storage access heuristics | Storage access automatically granted for First-Party isolation "b.example" on "a.example". |
Access to unpartitioned cookies is granted via the StorageAccessAPI | Storage access granted for origin "b.example" on "a.example". |
清除第三方存储访问权限
如果第三方iframe被授予对父上下文的存储访问权限,Firefox将设置一个权限。要撤销访问权限,您可以通过“跨站点Cookie”下权限部分的站点信息面板清除权限。
测试首选项
警告:请确保在单独的Firefox配置文件中设置这些首选项,或者在测试后重置它们。
禁用Web兼容性功能
将privacy.antitracking.enableWebcompat设置为false将禁用所有ETP和状态分区web兼容性功能。在测试时,禁用这些功能可能很有用,以确保您的网站与Firefox中的状态分区机制完全兼容,并且不依赖于临时启发。
pref禁用的功能包括:
- 存储访问启发法:只能通过存储访问API获取对cookie的未分区访问。
- 自动授予存储访问权限:document.requestStorageAccess将始终提示用户。
- SmartBlock的“选择加入时解锁”功能,当用户与某些跟踪器交互时,该功能将允许它们。
- 通过跳过列表机制授予网站的任何临时反跟踪例外情况。
禁用启发式
以下首选项可用于通过配置编辑器禁用单个存储访问启发:
- 启用/禁用重定向启发:privacy.srestrict3rdpartystorage.heuristic.recently_visited,privacy.sRestrict3rdartystorage.heuristic.redirect
- 启用/禁用窗口打开启发:privacy.srestrict3rdpartystorage.heuristic.window_open,privacy.sRestrict3rdartystorage.heuristic.opened_window_after_interaction
禁用网络分区
可以使用privacy.partition.Network_state pref禁用网络分区。
禁用动态状态分区
要禁用所有站点的动态存储分区,您可以使用network.cookie.cookieBehavior pref:
Value | Description |
---|---|
5 | Reject (known) trackers and partition third-party storage. |
4 | Only reject trackers (Storage partitioning disabled). |
0 | Allow all |
免除特定来源的分区
也可以使用privacy.slimit3rdpartystorage.skip_list首选项为特定的源禁用动态状态分区。此pref包含一个逗号分隔的要豁免的来源列表。pref值应遵循以下格式:第一方原始_1,第三方原始_1;第一方原始2,第三方原始2;。。。。
例如,要在example.com上禁用tracker.example分区,在news.example上禁用social.example分区,您可以将pref设置为以下值:
https://tracker.example,http://example.com;https://social.example,https://news.example
- 登录 发表评论