狀態分割槽
狀態分割槽是 Mozilla 正在進行的一項廣泛努力,旨在重新設計 Firefox 管理客戶端狀態(即儲存在瀏覽器中的資料)的方式,以降低網站利用狀態進行跨站點跟蹤的能力,例如透過 第三方 Cookie。
這項努力旨在透過為使用者訪問的每個網站提供一個分割槽儲存位置來實現這一目標。本文概述了該機制,列出了受影響的 API,並說明如何除錯受影響的網站。
狀態分割槽目前在 Firefox Nightly 通道中預設啟用。自 Firefox 85 版本起,狀態分割槽工作的一部分(即 網路分割槽)已在 Firefox 的發行版通道中預設啟用。
動機
使用共享狀態進行跨站點跟蹤
瀏覽器傳統上透過資源載入位置的來源(或有時是可註冊域名)來鍵入客戶端狀態。例如,可用於從 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 透過被載入資源的來源 和頂級網站 來對所有客戶端狀態進行雙重鍵入。在大多數情況下,頂級網站是使用者正在訪問的頂級頁面的方案和 eTLD+1。
在下面的示例中,example.com 嵌入在 A.example 和 B.example 中。但是,由於儲存已分割槽,因此存在三個獨立的儲存桶(而不是一個)。跟蹤器仍然可以訪問儲存,但由於每個儲存桶都附加了頂級網站的鍵,因此它在 A 上訪問的資料將不同於在 B 上訪問的資料。這將阻止跟蹤器在直接訪問時將其識別符號儲存在 Cookie 中,然後在嵌入在其他網站中時檢索該識別符號。
標準化
Firefox 中分割槽的狀態
靜態分割槽
儲存分割槽
為了防止 JavaScript 可訪問的儲存 API 被用於跨站點跟蹤,可訪問的儲存將按頂級網站進行分割槽。這種機制意味著,通常情況下,嵌入在一個頂級網站中的第三方無法訪問儲存在另一個頂級網站下的資料。
儲存 API
網路分割槽
與網路相關的 API 不打算用於網站儲存資料,但它們可能會被 濫用 來進行跨站點跟蹤。因此,以下網路 API 和快取將永久按頂級網站進行分割槽。
注意:網路分割槽是永久性的。網站無法控制或放鬆這些限制。
網路 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 透過 儲存訪問 API 請求對 Cookie 的未分割槽訪問許可權。一旦獲得授權,請求方將獲得對其所有第一方 Cookie 的訪問許可權(即,如果訪問時是第一方,它將擁有的訪問許可權)。
警告:當授予儲存訪問許可權時,仍然可能存在對分割槽儲存的引用。但是,網站不應依賴於能夠同時使用分割槽和未分割槽 Cookie。
除錯
我們鼓勵網站所有者測試他們的網站,特別是那些依賴於第三方內容整合的網站。Firefox 中有幾個功能可以簡化測試過程。
日誌記錄
以下是與第三方上下文中儲存進行互動時記錄到網頁控制檯的訊息概述。在以下示例中,a.example 是嵌入第三方框架 b.example 的頂級網站。
| 原因 | 控制檯訊息 |
|---|---|
| 第三方框架的儲存已分割槽 | 由於“b.example”是在第三方上下文中載入的,並且啟用了儲存分割槽,因此提供了分割槽後的 Cookie 或儲存訪問許可權。 |
| 透過 儲存訪問啟發式方法 授予對未分割槽 Cookie 的訪問許可權 | 自動授予“a.example”上“b.example”的第一方隔離的儲存訪問許可權。 |
| 透過 StorageAccessAPI 授予對未分割槽 Cookie 的訪問許可權 | 已授予“a.example”上“b.example”來源的儲存訪問許可權。 |
清除第三方儲存訪問許可權
如果第三方 iframe 被授予對父級上下文的儲存訪問許可權,Firefox 會設定一個許可權。 要撤銷訪問許可權,您可以透過“許可權”部分下“跨站點 Cookie”中的站點資訊面板清除許可權。
測試偏好設定
警告:請確保在獨立的 Firefox 配置檔案中設定這些偏好設定,或在測試後重置它們。
停用 Web 相容性功能
將 privacy.antitracking.enableWebcompat 設定為 false 將停用所有 ETP 和狀態分割槽 Web 相容性功能。 停用這些功能在測試時很有用,以確保您的網站與 Firefox 中的狀態分割槽機制完全相容,並且不依賴於臨時啟發式演算法。
pref 停用的功能包括
- 儲存訪問啟發式演算法:只有透過儲存訪問 API 才能獲得對 cookie 的未分割槽訪問許可權。
- 自動儲存訪問許可權授予:document.requestStorageAccess 將始終提示使用者。
- SmartBlock 的“選擇加入時解除阻止”功能,將在使用者與跟蹤器互動時允許某些跟蹤器。
- 透過跳過列表機制授予網站的任何臨時反跟蹤異常。
停用啟發式演算法
以下偏好設定可用於透過配置編輯器停用各個儲存訪問啟發式演算法
- 啟用/停用重定向啟發式演算法:
privacy.restrict3rdpartystorage.heuristic.recently_visited、privacy.restrict3rdpartystorage.heuristic.redirect - 啟用/停用視窗開啟啟發式演算法:
privacy.restrict3rdpartystorage.heuristic.window_open、privacy.restrict3rdpartystorage.heuristic.opened_window_after_interaction
停用網路分割槽
可以使用 privacy.partition.network_state pref 停用網路分割槽。
停用動態狀態分割槽
要為所有網站停用動態儲存分割槽,可以使用 network.cookie.cookieBehavior pref
| 值 | 描述 |
|---|---|
| 5 | 拒絕(已知)跟蹤器並分割槽第三方儲存。 |
| 4 | 僅拒絕跟蹤器(儲存分割槽已停用)。 |
| 0 | 允許所有 |
從分割槽中排除特定來源
也可以使用 privacy.restrict3rdpartystorage.skip_list 偏好設定,為特定來源停用動態狀態分割槽。 此 pref 包含一個以逗號分隔的來源列表以排除。 pref 值應遵循以下格式 first-party_origin_1,third-party_origin_1;first-party_origin_2,third-party_origin_2;...。
例如,要為 example.com 上的 tracker.example 和 news.example 上的 social.example 停用分割槽,您可以將 pref 設定為以下內容
https://tracker.example,http://example.com;https://social.example,https://news.example