围栏框架 API

实验性: 这是一个 实验性技术
在生产环境中使用此功能之前,请仔细查看 浏览器兼容性表

围栏框架 API 提供了用于控制嵌入在 <fencedframe> 元素中的内容的功能。

概念和用法

Web 上隐私和安全问题的一个主要来源是嵌入在 <iframe> 元素中的内容。从历史上看,<iframe> 已被用于设置第三方 Cookie,这些 Cookie 可用于跨站点共享信息和跟踪用户。此外,嵌入在 <iframe> 中的内容可以与其嵌入文档通信(例如,使用 Window.postMessage())。

嵌入文档还可以使用脚本读取 <iframe> 中的各种形式的信息——例如,您可以从读取 src 属性中的嵌入 URL 获取重要的跟踪/指纹数据,尤其是在它包含 URL 参数 的情况下。<iframe> 还可以访问嵌入上下文的 DOM,反之亦然。

大多数现代浏览器正在开发分区存储的机制,以便 Cookie 数据不再可用于跟踪(例如,请参阅 具有独立分区状态的 Cookie (CHIPS)Firefox 状态分区)。

<fencedframe> 元素旨在解决此难题的另一部分——它们在形式和功能上与 <iframe> 非常相似,但不同之处在于

  • <fencedframe> 内容与其嵌入站点之间无法共享通信。
  • <fencedframe> 可以访问跨站点数据,但仅限于一组非常具体的受控情况下,以保护用户隐私。
  • <fencedframe> 不能被随意操作或通过常规脚本访问其数据(例如读取或设置源 URL)。<fencedframe> 内容只能通过 特定 API 嵌入。
  • <fencedframe> 无法访问嵌入上下文的 DOM,嵌入上下文也无法访问 <fencedframe> 的 DOM。

有关围栏框架通信模型的更多信息,请阅读 与嵌入式框架通信 指南。

用例

<fencedframe> 由其他 API 用于嵌入不同类型的跨站点内容或收集数据,以隐私保护的方式满足不同的用例。以前大多数这些用例都依赖于第三方 Cookie 或其他不利于隐私的机制。

  • 共享存储 API 提供了在安全环境中访问未分区跨站点数据的功能,并在 <fencedframe> 中计算和/或显示结果。例如
    • 广告商可以衡量广告的覆盖范围,或根据用户在其他网站上已查看的广告投放后续广告。
    • 开发人员可以进行 A/B 测试,根据用户所属的组或每个组已有多少用户查看过,向用户显示不同的变体。
    • 企业可以根据用户在其他网站上看到的内容自定义用户的体验。例如,如果他们已经购买了会员资格,您可能不希望在您的其他属性上向他们显示会员注册广告。
  • 受保护受众 API 允许开发人员实现基于兴趣组的广告,即再营销和自定义受众用例。它可以评估多个广告位的出价,并在 <fencedframe> 中显示中标广告。
  • 私有聚合 API 可以从 <fencedframe>(源自共享存储或受保护受众 API)收集数据并创建聚合报告。

<fencedframe> 如何工作?

如上所述,您无法通过常规脚本直接控制嵌入在 <fencedframe> 中的内容。

要设置将在 <fencedframe> 中显示的内容,利用 API(例如 受保护受众共享存储)会生成一个 FencedFrameConfig 对象,然后通过 JavaScript 将其设置为 <fencedframe>HTMLFencedFrameElement.config 属性的值。

以下示例从受保护受众 API 的广告拍卖中获取 FencedFrameConfig,然后将其用于在 <fencedframe> 中显示中标广告

js
const frameConfig = await navigator.runAdAuction({
  // ...auction configuration
  resolveToConfig: true,
});

const frame = document.createElement("fencedframe");
frame.config = frameConfig;

必须将 resolveToConfig: true 传递给 runAdAuction() 调用以获取 FencedFrameConfig 对象。如果 resolveToConfig 设置为 false,则生成的 Promise 将解析为不透明的 URN(例如 urn:uuid:c36973b5-e5d9-de59-e4c4-364f137b3c7a),只能在 <iframe> 中使用。

无论哪种方式,浏览器都会存储一个包含要嵌入内容的目标位置的 URL——映射到不透明的 URN 或 FencedFrameConfig 的内部 url 属性。嵌入上下文中运行的 JavaScript 无法读取 URL 值。

注意:<iframe> 中提供了对不透明 URN 的支持,以方便将现有实现迁移到 隐私沙盒 API。此支持旨在临时使用,并且随着采用率的提高将在未来删除。

注意:FencedFrameConfig 具有一个 setSharedStorageContext() 方法,用于将数据从嵌入文档传递到 <fencedframe> 的共享存储。例如,它可以在 Worklet 中通过 <fencedframe> 访问,并用于生成报告。有关更多详细信息,请参阅 共享存储 API

Fence 对象上访问围栏框架功能

在嵌入 <fencedframe> 中的文档内部,JavaScript 可以访问一个 Window.fence 属性,该属性返回该文档的 Fence 实例。此对象包含一些与围栏框架 API 功能相关的特定函数。例如,Fence.reportEvent() 提供了一种通过 信标 向一个或多个指定 URL 触发提交报告数据的方法,以便报告广告查看和点击次数。

权限策略

只有专为在 <fencedframes> 中使用而设计的特定功能才能通过其上设置的权限策略启用;其他受策略控制的功能在此上下文中不可用。有关更多详细信息,请参阅 可用于围栏框架的权限策略

HTTP 标头

对于从 <fencedframe> 内部发出的任何请求,包括嵌入在 <fencedframe> 中的子 <iframe>,都会设置值为 fencedframeSec-Fetch-Dest 标头。

http
Sec-Fetch-Dest: fencedframe

对于任何打算加载到 <fencedframe> 或嵌入在 <fencedframe> 中的 <iframe> 中的文档,服务器必须设置值为 fenced-frameSupports-Loading-Mode 响应标头。

http
Supports-Loading-Mode: fenced-frame

围栏框架对 HTTP 标头的其他影响如下

  • 用户代理客户端提示 在围栏框架内部不可用,因为它们依赖于 权限策略 代理,这可能被用来泄露数据。
  • 在从围栏框架内部打开的新浏览上下文中强制执行严格的 Cross-Origin-Opener-Policy 设置,否则它们可能被用来将信息泄露到其他来源。从围栏框架内部打开的任何新窗口都将设置 rel="noopener"Cross-Origin-Opener-Policy: same-origin,以确保 Window.opener 返回 null 并将其置于其自己的浏览上下文组中。
  • Content-Security-Policy: fenced-frame-src 已添加用于指定加载到 <fencedframe> 元素中的嵌套浏览上下文的有效来源。
  • Content-Security-Policy: sandbox 自定义设置不能被围栏框架继承,以减轻隐私问题。要加载围栏框架,您需要指定没有 sandbox CSP(这意味着以下值),或指定以下沙盒值
    • allow-same-origin
    • allow-forms
    • allow-scripts
    • allow-popups
    • allow-popups-to-escape-sandbox
    • allow-top-navigation-by-user-activation

beforeunloadunload 事件

beforeunloadunload 事件不会在围栏框架上触发,因为它们可能会以页面删除时间戳的形式泄露信息。实现旨在消除尽可能多的潜在泄漏。

接口

FencedFrameConfig

表示 <fencedframe> 的导航,即将在其中显示的内容。FencedFrameConfig 来自某个来源(例如 受保护受众 API)并设置为 HTMLFencedFrameElement.config 的值。

Fence

包含多个与隔离框架功能相关的函数。仅适用于嵌入在<fencedframe>中的文档。

HTMLFencedFrameElement

在 JavaScript 中表示一个<fencedframe>元素,并提供用于配置它的属性。

其他接口的扩展

替换给定不透明 URN 或FencedFrameConfig的内部url属性对应映射 URL 中的指定字符串。

Window.fence

返回当前文档上下文的Fence对象实例。仅适用于嵌入在<fencedframe>中的文档。

注册和本地测试

某些创建FencedFrameConfig的 API 功能,例如Navigator.runAdAuction()受保护受众 API)和WindowSharedStorage.selectURL()共享存储 API),以及其他功能,例如Fence.reportEvent(),都需要您将您的网站加入隐私沙盒注册流程。如果您不这样做,API 调用将失败并显示控制台警告。

注意:在 Chrome 中,您仍然可以在本地测试您的隔离框架代码,无需注册。要允许本地测试,请启用以下 Chrome 开发者标志

chrome://flags/#privacy-sandbox-enrollment-overrides

示例

以下演示都使用了<fencedframe>

规范

规范
隔离框架
# the-fencedframe-element

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参阅