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 問題] 面板中顯示警告。 下列螢幕擷取畫面顯示此警告的範例。

修改 document.domain 時的警告。

如果您已設定報告端點,也會傳送取代報告。 深入瞭解 如何使用報表 API 搭配現有的報表集合服務,或建置您自己的報告解決方案。

提示

您可以透過 LightHouse 已被取代的 API 稽 核來執行您的網站,以尋找所有排程要從 Microsoft Edge 移除的 API。

替代的跨原始來源通訊

您目前有兩個選項可取代 document.domain 您的網站。 在大部分使用案例中,跨原始來源 postMessage () 通道傳訊 API 可以取代 document.domain

下列清單顯示開發人員需要採取的步驟,而不是 postMessage()document.domain 跨原始來源 DOM 操作。

  1. https://parent.example.com 透過 將訊息 postMessage() 傳送至 iframe,其中要求 https://video.example.com 它修改自己的 DOM。
  2. https://video.example.com 會操作其 DOM,並使用 postMessage 來通知父系其成功。
  3. 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 國際版本授權條款中所述條款加以使用。 原始頁面可在此處找到。

Creative Commons 授權
本作品根據創用 CC 姓名標示 4.0 國際版本授權條款獲得授權。