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

Arthur Sonzogni
Arthur Sonzogni

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

从 Chrome 110 版开始,无凭据 iframe 默认处于启用状态。它解决了使用 Cross-Origin-Embedder-Policy (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 Jar 开始。同样,LocalStorageCacheStorageIndexedDB 等存储 API 会在新的临时分区中加载和存储数据。该分区的作用域同时涵盖当前的顶级文档和 iFrame 的来源。卸载顶级文档后,系统会清除所有这些存储空间。

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

演示

您可以查看无凭据 iframe 的演示

常见问题解答

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

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

可以。它是继承的。一旦某个 iframe 不使用凭据,该设置将应用于整个子树中的所有 iframe,即使没有 credentialless 属性也是如此。

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

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

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

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

资源