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。而是从一个空的饼干罐开始。同样,LocalStorageCacheStorageIndexedDB 等存储 API 会在新的临时分区中加载和存储数据。该分区的范围限定为当前的顶级文档以及 iframe 的来源。一旦取消加载顶层文档,上述所有存储空间就会清空。

无凭据 iframe 不受 COEP 嵌入规则的约束。它们仍然很安全:因为它们每次都是从新的空上下文加载的,所以不应包含攻击者要追踪的个性化数据。如果某个 iframe 仅包含公开数据,那么它对攻击者没有价值。

演示

您可以查看无凭据 iframe 演示

常见问题解答

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

<iframe> 是否嵌套在 <iframe credentialless> 无凭据中?

可以。具有继承性。如果 iframe 没有凭据,那么即使没有 credentialless 属性,该值也会应用于整个子树中的所有 iframe。

使用 <iframe credentialless> 创建的弹出式窗口也是无需提供凭据的吗?

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

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

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

资源