Chrome:將禁用修改document.domain以放寬同源策略
你好,我是tiantian。
幾天前,Chrome developer 博客發(fā)布了這么一篇文章:
大致意思是,Chrome未來將禁用修改document.domain,如果你的網站依賴于設置document.domain 來解決跨域的問題,那么你可能需要注意了。
而且Chrome計劃從 Chrome 101 開始使 document.domain 不可變,也就是說如果你是依賴于這種方式放寬同源策略的話,你的站點可能受到影響。
domain
根據MDN的定義如下:
Document接口domain屬性獲取/設置當前文檔的原始域部分,常常用于同源策略。
要了解有關設置document.domain 的安全含義的更多信息,請閱讀 MDN :
https://developer.mozilla.org/zh-CN/docs/Web/API/Document/domain#setter
同源策略:保證一個網頁不能訪問(修改或提取數據)另一個頁面,除非這些頁面托管在同一源上。為了解決很多跨域間的通信問題,許多的網站會通過設置document.domain來達到目的。
例如,user1.example.com 和 user2.example.com之間是不能相互訪問的,為了實現這種跨域訪問,通過將 document.domain 設置為其公共域后綴,它們可以相互授予訪問權限。
使用率
跨域的方案有很多種,使用這種方式來放寬同源策略的,有多少站點呢?
在 2020-12-01 HTTP Archive 語料庫中,我們看到 7038 個頁面(在 7,849,064 中:0.09%)的行為受到 document.domain 的影響。
比如阿里巴巴在 *.alibaba.com 域(即 https://baominhjsc.trustpass.alibaba.com/)上運行店面,這些域依賴 document.domain 與來自 onetalk.alibaba.com 的域進行通信。
再比如qq.com 有大約 110 個子域,它們依賴于 document.domain 與 apps.game.qq.com 等框架通信登錄狀態(tài)。
所以對于我們開發(fā)人員來說,未來真的禁用了document.domain,我們應該怎么做呢?
新的提案
Origin-Agent-Cluster http 標頭(規(guī)范) 允許頁面請求被源(而不是站點)隔離。如果設置為 true ( Origin-Agent-Cluster: ?1 ),則要求瀏覽器按來源隔離頁面。如果為假,則按站點。(Agent Cluster 是隔離組的規(guī)范。由于低級隔離在 API 層不可見,規(guī)范只是粗略地觸及主題。)
詳細的解讀:
- Origin-Agent-Cluster: 標頭在存在時將繼續(xù)像當前一樣工作。當標頭不存在時,將更改的是默認值。
- 當頁面分配給 document.domain 但未設置 Origin-Agent-Cluster: ?0 標頭時,我們將實施控制臺警告。
所以未來有這么一種可能:通過 document.domain 放寬同源策略的唯一方法是發(fā)送一個 Origin-Agent-Cluster: ?0 標頭。
可能還有一個比較疑惑的問題,誰需要設置 Origin-Agent-Cluster 標頭?
個人覺得,任何一個希望設置 document.domain 來達到跨域通信的頁面,都需要通過發(fā)送 Origin-Agent-Cluster: ?0 來選擇加入該功能。
瀏覽器兼容性
對于這項工作的開放,The Origin specification 規(guī)范聲明該功能應該被刪除
主要意思是強調避免使用 document.domain,它會破壞了同源策略提供的安全保護。出于這些安全隱患,此功能正在從 Web 平臺中刪除。(這是一個漫長的過程,需要很多年。)
WebKit 表示他們對棄用 document.domain 持適度的積極態(tài)度。需要圍觀他們的討論,可以閱讀以下:
https://github.com/w3ctag/design-reviews/issues/564#issuecomment-768450217
小結
未來是否會禁用document.domain這種方式來放寬同源策略,這個過程應該很漫長。對于開發(fā)人員來說,我們可以通過設置 Origin-Agent-Cluster http 標頭來過渡。至于最后的方案如何,我們值得期待。
參考
https://developer.mozilla.org/zh-CN/docs/Web/API/Document/domain#setter
https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy
https://developer.chrome.com/blog/immutable-document-domain/
https://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage
https://github.com/mikewest/deprecating-document-domain/
https://github.com/mikewest/deprecating-document-domain/
https://github.com/mikewest/deprecating-document-domain/blob/main/2020-12-document-domain-usage.csv
https://html.spec.whatwg.org/multipage/origin.html
https://github.com/w3ctag/design-reviews/issues/564#issuecomment-768450217