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