如果您的網站需要設定 document.domain
,請務必採取行動。
更新
- 2023 年 5 月 30 日:我們宣布,
document.domain
setter 的淘汰作業將於 Chrome 115 生效。 - 2023 年 4 月 7 日:我們在 Chrome 112 中發布這項異動前,已找出問題。預設要移除的
document.domain
setter 目前已暫停,且新的發布里程碑尚未確定。請參閱這篇網誌文章,或是訂閱 blink-dev 和這個討論串。 - 2023 年 1 月 20 日:更新時間表:自 Chrome 112 起,
document.domain
setter 已預設為移除。此外,我們也新增了企業政策提及,用於控制document.domain
行為。 - 2022 年 7 月 25 日:更新時間表:
document.domain
setter 將從 Chrome 109 開始預設移除。 - 2022 年 2 月 4 日:更新為新時間表 - 我們會在 Chrome 100 以上版本的「Issues」面板中顯示警告,並在 Chrome 106 以上版本中預設移除
document.domain
setter。
document.domain
是用來取得或設定來源主機名稱。
在 Chrome 中,網站無法設定 document.domain
。您必須使用其他方法 (例如 postMessage()
或 Channel Messaging API) 進行跨來源通訊。我們預計最快會在 Chrome 112 中推出這項變更,但這取決於對意圖發布的回應。
如果您的網站需要透過 document.domain
放寬同源政策才能正常運作,該網站和所有需要該行為的其他文件都必須傳送 Origin-Agent-Cluster: ?0
標頭 (請注意,如果只有一個文件設定 document.domain
,則該標頭不會生效)。
為什麼要將 document.domain
設為不可變?
許多網站都會設定 document.domain
,允許同網站但不同原點的網頁之間進行通訊。
使用方式如下:
假設 https://parent.example.com
上的網頁嵌入 https://video.example.com
中的 iframe 頁面。這些網頁具有相同的 eTLD+1 (example.com
),但子網域不同。如果兩個網頁的 document.domain
都設為 'example.com'
,瀏覽器會將這兩個來源視為同源。
為 https://parent.example.com
設定 document.domain
:
// Confirm the current origin of "parent.example.com"
console.log(document.domain);
// Set the document.domain
document.domain = 'example.com';
console.log(document.domain);
為 https://video.example.com
設定 document.domain
:
// Confirm the current origin of "video.example.com"
console.log(document.domain);
// Set the document.domain
document.domain = 'example.com';
console.log(document.domain);
您現在可以在 https://parent.example.com
上針對 https://video.example.com
建立跨來源 DOM 操作。
網站會設定 document.domain
,讓同網站的文件更容易進行通訊。由於這項變更放寬了同源政策,因此父項頁面可以存取 iframe 的文件,並遍歷 DOM 樹狀結構,反之亦然。
這項技巧雖然方便,但會帶來安全風險。
document.domain
的安全疑慮
document.domain
的安全性問題導致規格異動,向使用者發出警告,提醒使用者避免使用該項目。其他瀏覽器供應商目前的討論將朝相同方向發展。
舉例來說,如果兩個網頁都設定 document.domain
,則兩者可以假裝為同源網頁。當這些網頁使用不同子網域的共用代管服務時,這一點就格外重要。設定 document.domain
會開放使用者存取同一個服務代管的所有其他網站,讓攻擊者更容易存取您的網站。這是因為 document.domain
會忽略網域的通訊埠號碼部分。
如要進一步瞭解設定 document.domain
的安全性影響,請參閱 MDN 的 "Document.domain" 頁面。
Chrome 預計在 Chrome 112 中將 document.domain
設為不可變動。
如何得知我的網站是否受到影響?
如果您的網站受到這項異動影響,Chrome 會在開發人員工具「Issues」面板中發出警告。請注意右上角出現黃色旗標。
如果您已設定回報端點,系統也會傳送淘汰報表。進一步瞭解如何使用 Reporting API 搭配現有的報表收集服務,或是自行建構內部解決方案。
您可以透過 Lighthouse 已淘汰的 API 稽核執行網站,找出所有已排定從 Chrome 中移除的 API。
其他跨來源通訊方式
目前,有三種方法可以取代網站的 document.domain
。
使用 postMessage()
或 Channel Messaging API
在大多數情況下,跨來源 postMessage()
或 Channel Messaging API 可以取代 document.domain
。
在下列範例中:
https://parent.example.com
會透過postMessage()
傳送訊息,要求 iframe 中的https://video.example.com
以操控 DOM。https://video.example.com
收到訊息後,就會操控 DOM,並將成功通知傳回至父項。https://parent.example.com
會確認成功。
在 https://parent.example.com
中:
// Send a message to https://video.example.com
iframe.postMessage('Request DOM manipulation', 'https://video.example.com');
// Receive messages
iframe.addEventListener('message', (event) => {
// Reject all messages except ones from https://video.example.com
if (event.origin !== 'https://video.example.com') return;
// Filter success messages
if (event.data === 'succeeded') {
// DOM manipulation is succeeded
}
});
在 https://video.example.com
:
// Receive messages
window.addEventListener('message', (event) => {
// Reject all messages except ones from https://parent.example.com
if (event.origin !== 'https://parent.example.com') return;
// Do a DOM manipulation on https://video.example.com.
// Send a success message to https://parent.example.com
event.source.postMessage('succeeded', event.origin);
});
試試看,瞭解運作方式。如果您有特定需求,但無法搭配 postMessage()
或 Channel Messaging API 使用,請透過 Twitter 上的 @ChromiumDev 與我們聯絡,或在 Stack Overflow 上提出問題,並加上 document.domain
標籤。
如非萬不得已,請傳送 Origin-Agent-Cluster: ?0
標頭
如果您有充分理由繼續設定 document.domain
,可以傳送 Origin-Agent-Cluster: ?0
回應標頭與目標文件。
Origin-Agent-Cluster: ?0
Origin-Agent-Cluster
標頭會指示瀏覽器是否應由 origin-keyed 代理程式叢集處理文件。如要進一步瞭解 Origin-Agent-Cluster
,請參閱「使用 Origin-Agent-Cluster
標頭要求效能隔離」。
傳送這個標頭後,即使 document.domain
預設為不可變更,文件仍可繼續設定 document.domain
。
設定企業政策的 OriginAgentClusterDefaultEnabled
如有需要,管理員可以將 OriginAgentClusterDefaultEnabled
政策設為 false
,讓整個機構的 Chrome 執行個體預設具備 document.domain
設定。如需更多資訊,請參閱「Chrome Enterprise 政策清單與管理服務 | 說明文件」。
瀏覽器相容性
- 「Origin」規格指出應移除這項功能。
- Mozilla 認為預設停用
document.domain
值得進行原型設計。 - WebKit 表示,他們對棄用
document.domain
Setter 的態度偏向正面。
資源
Document.domain
- Web API | MDN- 來源隔離和淘汰
document.domain
- 淘汰
document.domain
。· 問題 #564 · w3ctag/design-reviews
特別銘謝
相片來源:Braydon Anderson 在 Unsplash 網站上