无凭据 IFrame

可用性有限

此功能并非基线,因为它在一些使用最广泛的浏览器中无法使用。

实验性: 这是一项 实验性技术
在生产环境中使用此功能之前,请仔细查看 浏览器兼容性表

无凭据 IFrame 提供了一种机制,使开发人员能够使用新的、短暂的上下文在 <iframe> 中加载第三方资源。它无法访问其常规来源的网络、Cookie 和存储数据。它使用一个新的、特定于顶级文档生命周期的上下文。作为回报,可以解除 Cross-Origin-Embedder-Policy (COEP) 嵌入规则,因此设置了 COEP 的文档可以嵌入没有设置 COEP 的第三方文档。

问题

各种 Web API 功能只能在选择加入跨域隔离的网站上使用 - 例如 SharedArrayBuffer高分辨率计时器。这是因为这类功能存在被用于 Spectre 攻击 的风险,攻击者可以通过侧通道泄露受害者的机密信息。

要选择加入跨域隔离,资源必须使用 Cross-Origin-Opener-Policy 提供值为 same-origin 的值(保护您的来源免受攻击者攻击)和使用 Cross-Origin-Embedder-Policy 提供值为 credentiallessrequire-corp 的值(保护受害者免受您的来源攻击)。后者阻止文档加载任何凭据化的跨域资源,除非这些资源使用 Cross-Origin-Resource-Policy跨域资源共享 明确授予文档权限。

限制跨域隔离采用率的关键问题是 Cross-Origin-Embedder-Policy 是递归应用的 - 任何加载到具有 Cross-Origin-Embedder-Policy 设置的文档中的 <iframe> 中的第三方内容也必须部署 Cross-Origin-Embedder-Policy 才能成功嵌入。这对在应用程序中嵌入第三方内容(例如广告网络内容)的开发人员来说是一个问题,因为他们通常无法控制这些内容 - 他们目前唯一的选择是等待第三方内容提供商实施 Cross-Origin-Embedder-Policy

无凭据 IFrame 可以解决这个问题。

解决方案 - 无凭据 IFrame

通过对 <iframe> 应用 credentialless 属性,或将等效的 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。无凭据存储被单独分区,存储密钥通过每次顶级文档设置一次的随机数(“一次性数字”)值进行修改。因此,在某个无凭据 <iframe> 中设置的 Cookie 只能从嵌入在相同顶级文档下的其他同源无凭据 <iframe> 中访问。

随机数对于每个作为相同顶级文档的后代的无凭据 iframe 都是共享的,但对于用户导航到的每个不同的顶级文档都是不同的,并且一旦用户导航离开,就无法再访问。无凭据 IFrame 不会跨不同页面共享存储。返回到上面提到的 Cookie,重新加载文档将使用不同的上下文加载无凭据 <iframe>,因此以前设置的任何 Cookie 都将不可用。

此外

  • 由无凭据 iframe 打开的弹出窗口将使用已设置的 rel="noopener" 打开。这将阻止在无凭据 iframe 中使用 OAuth 弹出窗口流程。
  • 无凭据 <iframe> 中无法使用浏览器自动填充或密码管理器功能。

结果是,加载到无凭据 <iframe> 中的文档实际上是基本版本或“公共”版本,不会使用任何用户的敏感信息进行定制。由于这些文档中没有可泄露的敏感信息,因此对潜在攻击者来说毫无用处,因此对于这些 IFrame,跨域嵌入器策略要求会被删除。

子 IFrame 内部的递归无凭据

如果在具有嵌入在其中加载的文档中的子 <iframe><iframe> 上设置了 credentialless,那么这些子 <iframe> 将继承无凭据设置。

现场演示

使用 https://anonymous-iframe.glitch.me/ 演示来查看无凭据 IFrame 的实际效果。

规范

规范
无凭据 IFrame

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅