儲存空間分區

為防止某些類型的端管道跨網站追蹤,Chrome 已在第三方內容中分割大部分儲存空間和通訊 API。

導入狀態

這項功能已為 Chrome 115 以上版本的所有使用者啟用。儲存空間分區提案歡迎進一步討論。

什麼是儲存空間分區?

為防止某些類型的端管道跨網站追蹤,Chrome 會在第三方內容中分割儲存空間和通訊 API。

在沒有儲存空間分割的情況下,網站可以彙整不同網站的資料,以便在網路上追蹤使用者。此外,嵌入式網站還可使用側通道技術 (例如時間攻擊XS-LeaksCOSI),推斷頂層網站中使用者的特定狀態。

過去,儲存空間的索引鍵只會根據來源建立。也就是說,如果 example.com 的 iframe 嵌入 a.comb.com,則系統可以透過儲存並成功從儲存空間擷取 ID,瞭解您在這些網站上的瀏覽習慣。啟用第三方儲存空間分區後,example.com 的儲存空間會位於兩個不同的分區,一個用於 a.com,另一個用於 b.com

一般來說,分割作業是指儲存空間 API 儲存的資料 (例如本機儲存空間和 iframe 的 IndexedDB) 不再可供同一個來源的所有情境存取。相反地,只有具有相同來源和相同頂層網站的內容才能使用這項資料。

之前

未區隔的儲存空間 API 圖表。
在儲存空間分割前,example.com 可以在嵌入 a.com 時寫入資料,然後在嵌入 b.com 時讀取資料。

使用後

含有分割區的儲存空間 API 圖表。
在儲存空間分割後,當 example.com 嵌入 b.com 時,便無法存取 example.com 的儲存空間。

鏈結 iframe 上的儲存空間分區

當 iframe 包含 iframe 時,情況就會變得更複雜。尤其是當相同來源出現在鏈結的多個位置時。

舉例來說,A1 包含 B 的 iframe,而 B 包含 A2 的 iframe,且 A1 和 A2 都位於同一網站。如果我們在劃分時只考量頂層和目前層級的內容,那麼 iframe A2 可視為第一方,因為它與頂層 (A1) 位於同一網站,即使有第三方 iframe (B) 介入。如果 A2 預設可存取未分割的儲存空間,可能會讓 A2 面臨點按盜用等安全性風險。

為解決這個問題,Chrome 會在儲存空間分割鍵中加入額外的「祖系位元」,如果目前情境與頂層情境之間的任何文件是跨網站至目前情境,系統就會設定這個位元。在這種情況下,網站 B 是跨網站,因此會為 A2 設定位元,並將儲存空間從 A1 分割。

如果鏈結中沒有跨網站背景資訊,儲存空間就不會分割。舉例來說,網站 A1 包含 A2 的 iframe,而 A2 又包含 A3 的 iframe,因此系統不會為 A1、A2 和 A3 劃分區塊,因為這些網站都位於同一網站。

對於需要跨鏈結 iframe 存取的網站,Chrome 正在實驗擴充 Storage Access API 以支援此用途。由於 Storage Access API 要求框架網站明確叫用 API,因此可降低點擊劫持風險。

更新的 API

受分割影響的 API 可分為下列幾類:

Storage API

  • 配額系統
    配額系統會用來決定儲存空間的磁碟空間分配量。配額系統會將每個區隔視為獨立的值區,以便判斷允許的空間大小,以及清除時間。
    會傳回分區的資訊。navigator.storage.estimate()僅限 Chrome 的 API (例如 window.webkitStorageInfonavigator.webkitTemporaryStorage) 將淘汰。
    IndexedDB快取儲存空間會使用新的分區配額系統。
  • Web Storage API
    Web Storage API 提供機制,讓瀏覽器儲存鍵/值組合。有兩種機制:本機儲存空間工作階段儲存空間。目前並未受配額管理,但仍會進行分割。
  • Origin 私人檔案系統
    檔案系統存取權 API 可讓網站在使用者授予存取權後,直接讀取或儲存裝置上的檔案和資料夾變更。來源私人檔案系統可讓來源將私人內容儲存至磁碟,方便使用者存取,並且會分割。
  • Storage Bucket API
    Storage Bucket API 是為 Storage Standard 開發的,可透過名為值區的新概念,整合各種儲存空間 API,例如 IndexedDB 和 localStorage。值區中儲存的資料和與值區相關聯的中繼資料會分割。
  • Clear-Site-Data 標頭
    在回應中加入 Clear-Site-Data 標頭,可讓伺服器要求清除儲存在使用者瀏覽器中的資料。您可以清除快取、Cookie 和 DOM 儲存空間。使用標頭只會清除一個分區內的儲存空間。
  • Blob URL 儲存空間
    Blob 是包含待處理的原始資料的物件,可產生 Blob 網址來存取資源。Blob 網址儲存庫不會分割。為了支援在頂層情境中前往任何 blob URL 的用途 (討論),blob URL 儲存庫可能會由代理程式叢集劃分,而非頂層網站。這項功能目前無法進行測試,且分割機制日後可能會有所變更。

通訊 API

除了儲存空間 API 外,允許一個情境跨來源邊界進行通訊的通訊 API 也會分割。這項變更主要會影響允許透過廣播或同源會面來探索其他情境的 API。

對於下列通訊 API,第三方 iframe 將無法再與同來源內容互動:

  • 廣播頻道
    Broadcast Channel API 可讓瀏覽內容 (視窗、分頁或 iframe) 與同源的 worker 之間進行通訊。
    跨網站 iframe postMessage():如果已明確定義上下文之間的關係,則不建議變更。
  • SharedWorker
    SharedWorker API 提供可跨同源瀏覽內容存取的工作站。
  • 網頁封鎖功能
    Web Locks API 可讓在同一個來源的一個分頁或 worker 中執行的程式碼,在執行某些工作時取得共用資源的鎖定。

Service Worker API

Service Worker API 提供介面,可在背景執行工作。網站會建立持久註冊,以便建立新的 worker 內容,以便回應事件,而 worker 可以與任何相同來源內容進行通訊。此外,Service Worker API 還能變更導覽要求的時間,導致跨網站資訊洩漏的可能性,例如瀏覽記錄嗅探

因此,從第三方內容註冊的 Service Worker 會分割。

擴充功能 API

擴充功能是可讓使用者自訂瀏覽體驗的程式。

擴充功能頁面 (含有 chrome-extension:// 配置的頁面) 可嵌入網際網路上的網站,在這種情況下,這些頁面仍可存取其頂層區隔。這些頁面也可以嵌入其他網站,只要擴充功能具有該網站的主機權限,這些網站就能存取其頂層分區。

詳情請參閱擴充功能說明文件

示範:測試儲存空間分區

示範網站:https://storage-partitioning-demo-site-a.glitch.me/

示範網站的螢幕截圖,顯示每項測試的左側顯示綠色勾號,右側顯示紅色叉號。
示範畫面截圖,顯示瀏覽器的輸出內容,左側為有儲存空間分割的瀏覽器,右側則是沒有儲存空間分割的瀏覽器。

本示範使用兩個網站:網站 A 和網站 B。

  • 當您在頂層情境中造訪網站 A 時,該網站會使用各種儲存方法設定資料。
  • 網站 B 嵌入網站 A 的網頁,而該嵌入內容會嘗試讀取先前設定的儲存選項。
  • 當網站 A 嵌入網站 B 時,如果儲存空間已分割,則網站 A 無法存取該資料,因此讀取作業會失敗。
  • 這個示範會根據每次讀取的成功或失敗結果,顯示資料是否已分區。

目前,您可以使用 --disable-features=ThirdPartyStoragePartitioning 指令列切換鈕,在 Chrome 中關閉儲存空間分割功能。

您也可以以相同方式測試其他瀏覽器,查看其分割區狀態。

互動及分享意見回饋