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

在相同網站環境之間共用 WebAssembly 模組,僅限於相同來源。

同網站但跨來源環境之間共用 WebAssembly (Wasm) 模組,將可執行以下動作: 已淘汰,以便允許代理程式叢集 長期下來將範圍限定為出發地開發人員在這類環境中使用 Wasm 模組 一定要有一種方法一定要將相同來源的模組例項化,才能繼續 。

什麼是 Wasm 模組?運作方式

WebAssembly 程式分為多個模組 包括部署、載入和編譯

在下方範例程式碼中,從下列來源匯入 Wasm 模組 https://iframe.site.example 已透過以下方式與 https://main.site.example 分享: postMessage()。請注意,這些網域是相同網站,但跨來源的網域。

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。為了 因此必須限制需要網站輸入金鑰的功能 來源叢集:

  • (僅適用於 Chrome) 您將無法再傳送 SharedArrayBuffer敬上 或 WebAssembly.Memory。 將物件傳送至其他同網站跨來源頁面。這項功能已於 Chrome 92 版推出
  • 您無法再匯款 WebAssembly.Module敬上 透過 postMessage() 傳送至其他同網站跨來源頁面的物件。這項異動 。
  • 您無法再進行設定 document.domain。 這項舊版功能通常會允許同網站的不同來源頁面存取 同步存取彼此的 DOM,但在 origin-keyed 代理程式叢集中 已停用。

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

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

後續步驟與相關資源

為了讓 Chrome 預設使用 origin-keyed 代理程式叢集,我們要 將 document.domain 設為唯讀。Chrome 團隊想順利推行這項異動 一些時間

相片來源:Markus Winkler停用