在相同網站環境中共用 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 會在內部處理網站鍵代理程式叢集中的不同文件、分頁和框架。也就是說,同網站文件會在相同程序中處理 (具體運作方式因瀏覽器而異)。最近,Chrome 開始以更精細的單位 (來源) 處理這些項目。我們稱之為origin-keyed 代理程式叢集。不過,由於這項做法會耗用大量資源,因此我們只在少數網站上以啟發式方式套用 origin-keyed 代理程式叢集。
我們預計預設所有代理程式叢集都會使用 origin-keyed 模式。為達成這項目標,我們需要限制需要網站鍵來源叢集的功能:
- (僅限 Chrome) 您無法再將
SharedArrayBuffer
或WebAssembly.Memory
物件傳送至其他同網站跨網域網頁。Chrome 92 以上版本已採用這項做法。 - 您無法再透過
postMessage()
將WebAssembly.Module
物件傳送至其他同網站跨網域網頁。下文將進一步說明這項變更。 - 您無法再設定
document.domain
。這是一項舊版功能,通常會允許同網站跨來源網頁同步存取彼此的 DOM,但在以來源為依據的代理程式叢集中,這項功能會停用。
解決上述所有變更後,Chrome 預設會改為使用以來源為鍵的代理程式叢集。
如要進一步瞭解 origin-keyed 代理程式叢集,請參閱「使用 Origin-Agent-Cluster 標頭要求成效隔離」。
後續步驟與相關資源
為了讓 Chrome 預設使用來源鍵代理程式叢集,我們會將 document.domain
設為唯讀。Chrome 團隊預計於 2022 年某個時間推出這項變更。
相片來源:Markus Winkler 於 Unsplash 網站上提供