Microsoft Edge 將停用修改 document.domain
警告
如果您的網站依賴透過 document.domain
放寬相同原始來源原則,則需要您的動作。 繼續深入了解為何這會變更,或移至 替代跨原始來源通訊 ,以了解達成跨原始來源通訊的替代機制。
簡介
Document 介面的 「domain」 屬性會取得或設定目前檔原點的網域部分,如 同源原則所使用。
Microsoft Edge 繼承了 Chromium 的這項變更。 現在會忽略使用 JavaScript 修改 document.domain
屬性的嘗試。 您必須使用替代方法,例如 postMessage()
或通道傳訊 API,以跨原始來源進行通訊。 這項變更是在Edge 119和更新版本中。
或者,如果您的網站依賴透過的相同原始來源原則 document.domain
來正常運作,網站可能會傳送 Origin-Agent-Cluster: ?0
標頭;此標頭必須從所有其他需要檢查的檔傳送。
注意
document.domain
如果只有一份檔設定,則沒有任何作用。
為何要讓 不可 document.domain
變?
某些網站設定 document.domain
為允許「同一網站但跨原始來源」頁面之間的通訊。 設定 document.domain
可讓同一網站檔更輕鬆地進行通訊。 因為這項變更 會放寬相同來源原則,所以父頁面可以存取相同網站 iframe 的檔並周遊 DOM 樹狀結構,反之亦然。
重要
相同網站但跨原始來源網站具有相同的 eTLD+1 但不同的子域。
假設上有一個頁面 https://parent.example.com
內嵌來自 https://video.example.com
的 iframe 頁面。 這些頁面具有具有不同子域的相同 eTLD+1 (example.com
) 。 當兩個頁面都 document.domain
設定為 'example.com'
時,瀏覽器會將這兩個頁面視為相同來源。
這項技術很方便;但會帶來安全性風險。
安全性考慮 document.domain
有關的安全性 document.domain
考慮導致規格變更,警告開發人員有關此問題,並告知他們盡可能避免使用此問題。 目前 與其他瀏覽器廠商 的討論正以相同的方向進行。
下列範例示範攻擊者如何濫用 document.domain
。
請考慮為每個客戶提供唯一子域的共用主機服務。 如果開發人員在其頁面中設定 document.domain
,攻擊者從不同子域提供的頁面可以設定相同的值,並修改犧牲者頁面的內容。
同樣地,請考慮為每個客戶使用不同埠的頁面提供服務的共用主機服務。 如果開發人員在其頁面中設定 document.domain
,攻擊者從不同埠提供的頁面可以設定相同的值,並修改犧牲者頁面的內容。 因為忽略來源的埠號碼元件,所以可能會 document.domain
發生此攻擊。
注意
若要深入了解設定 document.domain
的安全性含意,請閱讀 MDN 上的 Document.domain 一文。
如何得知我的網站是否受到影響?
如果您的網站受到這項變更影響,Microsoft Edge 會在 [DevTools 問題] 面板中顯示警告。 下列螢幕快照顯示此警告的範例。
如果您已設定報告端點,也會傳送取代報告。 深入瞭解 如何使用報表 API 搭配現有的報表集合服務,或建置您自己的報告解決方案。
提示
您可以透過 LightHouse 已被取代的 API 稽 核來執行您的網站,以尋找所有排程從 Microsoft Edge 移除的 API。
替代的跨原始來源通訊
您目前有兩個選項可取代 document.domain
您的網站。 在大部分使用案例中,跨原始來源 postMessage () 或 通道傳訊 API 可以取代 document.domain
。
下列清單顯示開發人員需要採取的步驟,而不是postMessage()
document.domain
跨原始來源 DOM 操作。
https://parent.example.com
透過將訊息postMessage()
傳送至 iframe,其中要求https://video.example.com
它修改自己的 DOM。https://video.example.com
會操作其 DOM,並使用postMessage
來通知父系其成功。https://parent.example.com
認可成功。
針對的 https://parent.example.com
步驟 1:
// Configure a handler to receive messages from the subframe.
iframe.addEventListener('message', (event) => {
// Reject all messages except from https://video.example.com
if (event.origin !== 'https://video.example.com') return;
// Filter success messages
if (event.data === 'succeeded') {
// DOM manipulation is succeeded
}
});
// Send a message to the subframe at https://video.example.com
iframe.postMessage('Request DOM manipulation', 'https://video.example.com');
針對 上的 https://video.example.com
步驟 2:
// Configure a handler to receive messages from the parent frame.
window.addEventListener('message', (event) => {
// Reject all messages except ones from https://parent.example.com
if (event.origin !== 'https://parent.example.com') return;
// Perform requested DOM manipulation on https://video.example.com.
if (event.data === "showTheButton") {
document.getElementById('btnContinue').style.visibility = 'visible';
// Send a success message back to the parent.
event.source.postMessage('succeeded', event.origin);
}
});
Origin-Agent-Cluster: ?0
傳送標頭做為最後的手段
如果您有繼續設定 document.domain
的強大理由,您可以在目標檔上傳送 Origin-Agent-Cluster: ?0
響應標頭。
Origin-Agent-Cluster: ?0
標 Origin-Agent-Cluster
頭會指示瀏覽器是否應由原始密鑰代理程式叢集處理檔。 若要 Origin-Agent-Cluster
深入瞭解 ,請參閱使用 Origin-Agent-Cluster 標頭要求效能隔離。
當您傳送此標頭時,即使文件預設為不可變,仍可繼續設定 document.domain
。
瀏覽器相容性
下列組織支持 document.domain
為了瀏覽器相容性而淘汰。
- 原始規格指出應移除此功能。
- Mozilla 標準位置預設會考慮停
document.domain
用值得原型設計。 - WebKit 表示它們對於即將淘汰
document.domain
的 setter 相當正面。
其他資源
內容授權
注意
本頁的某些部分是根據 Chromium.org 創造和分享的作品加以修改,並根據創用 CC 姓名標示 4.0 國際版本授權條款中所述條款加以使用。 原始頁面可在此處找到。
本作品根據創用 CC 姓名標示 4.0 國際版本授權條款獲得授權。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應