无凭据 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
提供值为 credentialless
或 require-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>
成为无凭据的。
<iframe
src="https://en.wikipedia.org/wiki/Spectre_(security_vulnerability)"
title="Spectre vulnerability Wikipedia page"
width="960"
height="600"
credentialless></iframe>
或
<iframe width="960" height="600"> </iframe>
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>
中加载的文档使用新的、短暂的上下文 - 这些上下文无法访问与其来源关联的数据;例如 Cookie 和 localStorage。无凭据存储被单独分区,存储密钥通过每次顶级文档设置一次的随机数(“一次性数字”)值进行修改。因此,在某个无凭据 <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 的浏览器中加载。