匿名 iframe 源试用:在 COEP 环境中轻松嵌入 iframe

亚瑟·桑佐尼
Arthur Sonzogni

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

为什么我们需要 COEP

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

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

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

启用 COEP 的挑战

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

iframe 通常由可能不容易为其部署 COEP 的第三方提供。

来支援匿名 iframe

这正是匿名 iframe 的用武之地。向 <iframe> 元素添加 anonymous 属性后,系统会从其他临时存储分区加载 iframe,并且不会再受到 COEP 限制。

例如:

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

iframe 是在新的临时上下文中创建的,它无权访问与顶级网站关联的任何 Cookie。从空的 Cookie 罐开始。同样,LocalStorageCacheStorageIndexedDB 等存储 API 也会在新的临时分区中加载和存储数据。该分区的范围限定为当前的顶级文档和 iframe 的来源。顶级文档卸载后,存储空间将被清除。

匿名 iframe 不受 COEP 嵌入规则的约束。这仍然安全,因为它们每次都从新的空上下文加载。系统将加载它们,但不会对这些数据进行个性化。它们只包含公开数据,这对攻击者没有价值。

演示

您可以访问以下网址查看匿名 iframe:https://anonymous-iframe.glitch.me/

注册源试用

为了确保匿名 iframe 有助于开发者采用跨域隔离,我们将以源试用的形式在 Chrome 106 到 108 期间提供这些 iframe。

注册参加源试用,让您的网站能够使用匿名 iframe:

  1. 为您的源请求令牌
  2. 您可以通过以下任一方式使用令牌:
    • 在您的 HTML 中: html <meta http-equiv="Origin-Trial" content="TOKEN_GOES_HERE">
    • 在您的 JavaScript 中: js const meta = document.createElement('meta'); meta.httpEquiv = 'Origin-Trial'; meta.content = 'TOKEN_GOES_HERE'; document.head.append(meta);
    • 在 HTTP 标头中: text Origin-Trial: TOKEN_GOES_HERE
  3. 向网页添加匿名 iframe:html <iframe anonymous src="https://example.com">

如果您对此功能有任何反馈,请在 GitHub 代码库中提交问题。

第三方源试用

源试用也适用于第三方脚本。也就是说,可以通过网页中嵌入的脚本启用此功能。

详细了解如何注册第三方源试用

常见问题解答

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

iframe 是否嵌套在 <iframe anonymous> 内?

是的。具有继承性。iframe 一旦匿名化,便会应用于整个子树中的所有 iframe,即使没有 anonymous 属性也是如此。

通过 <iframe anonymous> 创建的弹出式窗口是否也采用匿名方式?

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

资源