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 |
浏览器兼容性
加载中…