Chrome 將停用修改 document.domain,以放寬相同來源政策

如果您的網站需要設定 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」面板中發出警告。請注意右上角出現黃色旗標。

修改 document.domain 時,問題面板會顯示警告。
修改文件之後,「問題」面板中會顯示警告訊息。

如果您已設定回報端點,系統也會傳送淘汰報表。進一步瞭解如何使用 Reporting API 搭配現有的報表收集服務,或是自行建構內部解決方案。

您可以透過 Lighthouse 已淘汰的 API 稽核執行網站,找出所有已排定從 Chrome 中移除的 API。

其他跨來源通訊方式

目前,有三種方法可以取代網站的 document.domain

使用 postMessage() 或 Channel Messaging API

在大多數情況下,跨來源 postMessage()Channel Messaging API 可以取代 document.domain

在下列範例中:

  1. https://parent.example.com 會透過 postMessage() 傳送訊息,要求 iframe 中的 https://video.example.com 以操控 DOM。
  2. https://video.example.com 收到訊息後,就會操控 DOM,並將成功通知傳回至父項。
  3. 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 政策清單與管理服務 | 說明文件」。

瀏覽器相容性

資源

特別銘謝

相片來源:Braydon AndersonUnsplash 網站上