將 Wasm 模組共用功能限制為相同來源

只有在相同網站環境之間共用 WebAssembly 模組時,只有來源相同。

我們將淘汰在相同網站但跨來源環境之間共用 WebAssembly (Wasm) 模組,讓代理程式叢集將範圍限定為長期來源。如果開發人員以這種方式使用 Wasm 模組,請務必將相同來源的模組例項化,以便在 Chrome 95 版後繼續使用這些模組。

Wasm 模組簡介與運作方式

WebAssembly 程式會組織成模組,也就是部署、載入和編譯的單位。

在以下程式碼範例中,從 https://iframe.site.example 匯入的 Wasm 模組會透過 postMessage()https://main.site.example 共用。請注意,這些網域屬於相同網站但跨來源

https://iframe.site.example 上的 Wasm 模組:

(async () => {
  const instance = await WebAssembly.instantiateStreaming(fetch('./add.wasm'), {});
  iframe.contentWindow.postMessage(instance.module, `https://main.site.example`);
})();

從 Chrome 95 版開始,傳送者和接收者必須是相同來源。在上述情況中,https://iframe.site.example 必須是 https://main.site.example,反之亦然。

為什麼需要這麼做

Chrome 在內部處理 site-keyed 代理程式叢集上的不同文件、分頁與頁框。這表示系統會透過相同程序處理相同的網站文件 (實際運作方式因瀏覽器而異)。最近,Chrome 開始以更精細的單位 (來源) 處理這些事件。稱為 origin-keyed 代理程式叢集。不過,由於這麼做會耗用大量資源,origin-keyed 代理程式叢集只會在經驗情況下套用到有限的網站。

我們的計畫是將所有代理程式叢集都設為 origin-key。為了達成此目標,我們需要限制需要 site-keyed 來源叢集的功能:

  • (僅限 Chrome) 您無法再將 SharedArrayBufferWebAssembly.Memory 物件傳送至其他同網站但不同來源的頁面。這項功能自 Chrome 92 版起已採用
  • 您無法再透過 postMessage()WebAssembly.Module 物件傳送至其他的相同網站跨來源頁面。這項變更會詳細說明如下。
  • 您無法再設定 document.domain。這是一項舊版功能,一般會允許相同網站的跨來源頁面同步存取彼此的 DOM,但在 origin-keyed 代理程式叢集中,這項功能會停用。

解決上述所有變更後,Chrome 預設會改用 origin-keyed 代理程式叢集。

如要進一步瞭解 origin-keyed 代理程式叢集,請參閱透過 Origin-Agent-Cluster 標頭要求效能隔離

後續步驟與相關資源

為了讓 Chrome 根據預設支援 origin-keyed 代理程式叢集,我們會將 document.domain 設為唯讀。Chrome 團隊的目標是在 2022 年 有時間實現這項變更

相片來源:Markus WinklerUnsplash 上發布