iframe 无凭据:轻松在 COEP 环境中嵌入 iframe

Arthur Sonzogni
Arthur Sonzogni

使用 COEP 的开发者现在可以嵌入本身不使用 COEP 的第三方 iframe。

从 Chrome 110 版开始,系统会默认启用无凭据 iframe。它解决了使用跨域嵌入器政策 (COEP) 的开发者最常遇到的投诉:嵌入未设置 COEP 的第三方 iframe。

为什么我们需要 COEP

某些 Web API 会增加旁路攻击的风险,例如 Spectre。为了降低这种风险,浏览器提供了一个名为跨域隔离的基于选择启用的隔离环境,这需要部署 COEP。跨域隔离可让网站使用特权功能,包括 SharedArrayBufferperformance.measureUserAgentSpecificMemory()分辨率更高的高精度计时器

如要启用跨域隔离,网站必须发送以下 HTTP 标头:

Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin

COEP:credentialless 也可用作 require-corp 的替代方案。如需了解详情,请参阅文档

启用 COEP 的挑战

虽然跨域隔离可以提高网页的安全性,并且能够实现强大的功能,但部署 COEP 可能困难。其中最大的挑战之一是所有跨源 iframe 都必须部署 COEP 和 CORP。浏览器将不会加载没有这些标头的 iframe。

补救无凭据 iframe

我们引入了 <iframe credentialless>,以帮助嵌入未设置 COEP 的第三方 iframe。向 <iframe> 元素添加 credentialless 属性后,系统会从其他空上下文加载 iframe。特别是,加载时不使用 Cookie。这样就可以取消 COEP 限制。

例如:

<iframe credentialless src="https://example.com">

此 iframe 是在新的临时环境中创建的,它无权访问与顶级网站关联的任何 Cookie。而是从一个空的 Cookie 罐开始。同样,LocalStorageCacheStorageIndexedDB 等存储 API 会在新的临时分区中加载和存储数据。该分区的范围限定为当前的顶级文档和 iframe 的来源。卸载顶级文档后,系统会清除所有这些存储空间。

无凭据 iframe 不受 COEP 嵌入规则的约束。它们仍然是安全的:由于它们每次都从新的空上下文加载,因此不应包含个性化数据,而这正是攻击者的追求。如果 iframe 仅包含公开数据,则对攻击者而言没有价值。

演示

您可以观看无凭据 iframe 演示

常见问题解答

其他浏览器会采用此功能吗?

无凭据的 <iframe credentialless> 中是否嵌套了 <iframe>

可以。具有继承性。一旦 iframe 是无凭据的,它就会应用于整个子树中的所有 iframe,即使没有 credentialless 属性也是如此。

通过 <iframe credentialless> 创建的弹出式窗口是否也无凭据?

弹出式窗口会打开,就像设置了 noopener 一样。凭据是在新的常规顶级上下文中创建的,并且不是无凭据的。它们无法与无凭据 iframe 通信。

如何检测文档是否嵌入到了无凭据 iframe 中?

在无凭据 iframe 内,window.credentialless 为 true,否则为 false。在不支持 <iframe credentialless> 的网络浏览器中,其值为 undefined

资源