IFrame 憑證缺失

可用性有限

此特性不是基線特性,因為它在一些最廣泛使用的瀏覽器中不起作用。

實驗性: 這是一項實驗性技術
在生產中使用此技術之前,請仔細檢查瀏覽器相容性表格

IFrame 憑證缺失 為開發者提供了一種機制,允許在 <iframe> 中使用新的、臨時的上下文載入第三方資源。它無法訪問其常規源的網路、Cookie 和儲存資料。它使用一個僅限於頂層文件生命週期的新上下文。作為回報,可以放寬 Cross-Origin-Embedder-Policy (COEP) 嵌入規則,以便設定了 COEP 的文件可以嵌入未設定 COEP 的第三方文件。

問題

各種 Web API 功能只能在選擇加入跨源隔離的站點上使用 — 例如 SharedArrayBuffer高解析度計時器。這是因為存在此類功能被 Spectre 攻擊 利用的風險,攻擊者可以透過側通道洩露受害者的機密資訊。

要選擇加入跨源隔離,資源必須透過設定值為 same-origin(保護您的源免受攻擊者侵害)的 Cross-Origin-Opener-Policy 和設定值為 credentiallessrequire-corp(保護受害者免受您的源侵害)的 Cross-Origin-Embedder-Policy 來提供。後者會阻止文件載入任何未經明確授權的、未透過 Cross-Origin-Resource-Policy跨源資源共享 獲得文件許可的憑證化跨源資源。

限制跨源隔離採用的關鍵問題在於 Cross-Origin-Embedder-Policy 是遞迴應用的 — 任何載入到設定了 Cross-Origin-Embedder-Policy 的文件的 <iframe> 中的第三方內容也必須部署 Cross-Origin-Embedder-Policy 才能成功嵌入。這對於在其應用中嵌入第三方內容的開發者(例如廣告網路內容)來說是一個問題,因為他們通常無法控制這些內容 — 到目前為止,他們唯一的選擇是等待第三方內容提供商實現 Cross-Origin-Embedder-Policy

這個問題可以透過 IFrame 憑證缺失來解決。

解決方案 — Iframe 憑證缺失

透過將 credentialless 屬性應用於 <iframe>,或設定等效的 DOM 屬性 — HTMLIFrameElement.credentialless — 為 true,可以使 <iframe> 成為憑證缺失的。

html
<iframe
  src="https://en.wikipedia.org/wiki/Spectre_(security_vulnerability)"
  title="Spectre vulnerability Wikipedia page"
  width="960"
  height="600"
  credentialless></iframe>

或者

html
<iframe width="960" height="600"> </iframe>
js
const iframeElem = document.querySelector("iframe");

iframeElem.credentialless = true;
iframeElem.title = "Spectre vulnerability Wikipedia page";
iframeElem.src =
  "https://en.wikipedia.org/wiki/Spectre_(security_vulnerability)";

注意: 嵌入在 <iframe> 中的文件可以透過查詢 window.credentialless 屬性來測試它是否在憑證缺失的上下文中執行。值為 true 表示嵌入的 <iframe> 是憑證缺失的。

這導致憑證缺失 <iframe> 中的文件使用新的、臨時的上下文載入 — 這些上下文無法訪問與其源相關聯的資料;例如 CookielocalStorage。憑證缺失的儲存是單獨分割槽的,儲存鍵透過一個 nonce(“一次性使用的數字”)值進行修改,該值針對每個頂層文件設定一次。因此,在一個憑證缺失的 <iframe> 中設定的 Cookie 只能從同一頂層文件下嵌入的其他同源憑證缺失的 <iframe> 中訪問。

nonce 對於作為同一頂層文件後代的每個憑證缺失的 iframe 都是共享的,但對於使用者導航到的每個不同的頂層文件,它都是不同的,並且一旦使用者導航離開,就不再可訪問。憑證缺失 IFrames 不會在不同頁面之間共享儲存。回到上面提到的 Cookie,重新載入文件將會在不同的上下文中載入憑證缺失的 <iframe>,因此之前設定的 Cookie 都將不可用。

此外

  • 由憑證缺失的 iframes 開啟的彈出視窗將設定 rel="noopener"。這可以防止 OAuth 彈出視窗流在憑證缺失的 iframes 中被使用。
  • 瀏覽器自動填充或密碼管理器功能在憑證缺失的 <iframe> 中不可用。

其結果是,載入到憑證缺失的 <iframe> 中的文件實際上是標準的或“公共”版本,而不是用任何使用者的敏感資訊自定義的。由於這些文件中沒有敏感資訊可供洩露,因此它們對潛在的攻擊者毫無用處,因此對於這些 IFrames,Cross-Origin Embedder Policy 的要求被取消了。

子 IFrames 內的遞迴憑證缺失

如果在一個包含嵌入在其中的文件的子 <iframe><iframe> 上設定了 credentialless,那麼這些子 <iframe> 將繼承憑證缺失的設定。

規範

規範
Iframe credentialless

瀏覽器相容性

另見