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

浏览器兼容性

另见