IFrame 憑證缺失
IFrame 憑證缺失 為開發者提供了一種機制,允許在 <iframe> 中使用新的、臨時的上下文載入第三方資源。它無法訪問其常規源的網路、Cookie 和儲存資料。它使用一個僅限於頂層文件生命週期的新上下文。作為回報,可以放寬 Cross-Origin-Embedder-Policy (COEP) 嵌入規則,以便設定了 COEP 的文件可以嵌入未設定 COEP 的第三方文件。
問題
各種 Web API 功能只能在選擇加入跨源隔離的站點上使用 — 例如 SharedArrayBuffer 和 高解析度計時器。這是因為存在此類功能被 Spectre 攻擊 利用的風險,攻擊者可以透過側通道洩露受害者的機密資訊。
要選擇加入跨源隔離,資源必須透過設定值為 same-origin(保護您的源免受攻擊者侵害)的 Cross-Origin-Opener-Policy 和設定值為 credentialless 或 require-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> 成為憑證缺失的。
<iframe
src="https://en.wikipedia.org/wiki/Spectre_(security_vulnerability)"
title="Spectre vulnerability Wikipedia page"
width="960"
height="600"
credentialless></iframe>
或者
<iframe width="960" height="600"> </iframe>
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> 中的文件使用新的、臨時的上下文載入 — 這些上下文無法訪問與其源相關聯的資料;例如 Cookie 和 localStorage。憑證缺失的儲存是單獨分割槽的,儲存鍵透過一個 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 |
瀏覽器相容性
載入中…