1. 7 加载网页
    1. 7.1 支持的概念
      1. 7.1.1 来源
        1. 7.1.1.1 站点
        2. 7.1.1.2 放宽同源策略限制
      2. 7.1.2 基于来源的代理集群
      3. 7.1.3 跨域打开策略
        1. 7.1.3.1 头部信息
        2. 7.1.3.2 由于打开策略导致的浏览上下文组切换
        3. 7.1.3.3 报告
      4. 7.1.4 跨域嵌入策略
        1. 7.1.4.1 头部信息
        2. 7.1.4.2 嵌入策略检查
      5. 7.1.5 沙盒
      6. 7.1.6 策略容器

7 加载网页

本节介绍了最直接适用于网络浏览器的功能。尽管如此,除非另有说明,本节定义的要求确实适用于所有用户代理,无论它们是网络浏览器还是其他类型。

7.1 支持的概念

7.1.1 来源

来源是网络安全模型的基本货币。在网络平台中,共享同一个来源的两个参与者被假定相互信任并具有相同的权限。来源不同的参与者被认为彼此之间可能具有敌意,并且在不同程度上相互隔离。

例如,如果托管在 bank.example.com 上的示例银行网站试图检查托管在 charity.example.org 上的示例慈善机构网站的 DOM,则会引发 "SecurityError" DOMException


一个 来源 是以下之一

一个 不透明来源

一个内部值,没有可以从其重新创建的序列化(根据 来源的序列化,它被序列化为 "null"),对于其唯一有意义的操作是测试相等性。

一个 元组来源

一个 元组 包含以下内容

来源 可以共享,例如,在多个 Document 对象之间共享。此外,来源 通常是不可变的。只有 元组来源 可以更改,并且只能通过 document.domain API 更改。

一个 来源 origin有效域 按照以下步骤计算

  1. 如果 origin 是一个 不透明来源,则返回 null。

  2. 如果 origin 不为空,则返回 origin

  3. 返回 origin主机

一个 来源序列化 是通过对给定的 来源 origin 应用以下算法获得的字符串

  1. 如果 origin 是一个 不透明来源,则返回 "null"。

  2. 否则,令 resultorigin方案

  3. 将 "://" 附加到 result

  4. origin主机序列化,附加到 result

  5. 如果 origin端口 不为空,则将 U+003A COLON 字符 (:) 和 origin端口序列化,附加到 result

  6. 返回 result

("https", "xn--maraa-rta.example", null, null) 的 序列化 是 "https://xn--maraa-rta.example"。

以前还存在一个来源的 Unicode 序列化。但是,它从未被广泛采用。


两个 来源AB,如果以下算法返回 true,则被称为 同源

  1. 如果 AB 是同一个 不透明来源,则返回 true。

  2. 如果 AB 都是 元组来源 并且它们的 方案主机端口 相同,则返回 true。

  3. 返回 false。

两个 来源AB,如果以下算法返回 true,则被称为 同源域

  1. 如果 AB 是同一个 不透明来源,则返回 true。

  2. 如果 AB 都是 元组来源

    1. 如果 AB方案 相同,并且它们的 相同且不为空,则返回 true。

    2. 否则,如果 AB同源 并且它们的 都为空,则返回 true。

  3. 返回 false。

A B 同源 同源域
("https", "example.org", null, null)("https", "example.org", null, null)
("https", "example.org", 314, null)("https", "example.org", 420, null)
("https", "example.org", 314, "example.org")("https", "example.org", 420, "example.org")
("https", "example.org", null, null)("https", "example.org", null, "example.org")
("https", "example.org", null, "example.org")("http", "example.org", null, "example.org")
7.1.1.1 站点

一个 方案和主机 是一个 元组,包含一个 方案(一个 ASCII 字符串)和一个 主机(一个 主机)。

一个 站点 是一个 不透明来源 或一个 方案和主机

获取一个站点,给定一个来源 origin,执行以下步骤

  1. 如果 origin 是一个 不透明来源,则返回 origin

  2. 如果 origin主机可注册域 为 null,则返回 (origin方案origin主机)。

  3. 返回 (origin方案origin主机可注册域)。

两个 站点AB,如果以下算法返回 true,则被称为 同站点

  1. 如果 AB 是同一个 不透明来源,则返回 true。

  2. 如果 AB 是一个 不透明来源,则返回 false。

  3. 如果 AB方案 值不同,则返回 false。

  4. 如果 AB主机 值不 相等,则返回 false。

  5. 返回 true。

一个 站点序列化 是通过对给定的 站点 site 应用以下算法获得的字符串

  1. 如果 site 是一个 不透明来源,则返回 "null"。

  2. resultsite[0]。

  3. 将 "://" 附加到 result

  4. site[1],序列化,附加到 result

  5. 返回 result

需要从上下文中明确,序列化值是一个站点,而不是一个来源,因为两者之间不一定存在语法上的区别。例如,来源 ("https", "shop.example", null, null) 和站点 ("https", "shop.example") 具有相同的序列化: "https://shop.example"。

两个 来源AB,如果以下算法返回 true,则被称为 无方案同站点

  1. 如果 AB 是同一个 不透明来源,则返回 true。

  2. 如果 AB 都是 元组来源,则

    1. hostAA主机,令 hostBB主机

    2. 如果 hostA 等于 hostB 并且 hostA可注册域 为 null,则返回 true。

    3. 如果 hostA可注册域 等于 hostB可注册域 且不为空,则返回 true。

  3. 返回 false。

两个 来源AB,如果以下算法返回 true,则被称为 同站点

  1. siteA 为给定 A获取站点 的结果。

  2. siteB 为给定 B获取站点 的结果。

  3. 如果 siteAsiteB 同站,则返回 true。

  4. 返回 false。

同源同源域 概念不同,对于 无协议同站同站端口域名 部分会被忽略。

出于在 《URL》中解释 的原因,应尽可能避免使用 同站无协议同站 概念,而应优先使用 同源 检查。

鉴于 wildlife.museummuseumcom公共后缀,而 example.com 不是

A B 无协议同站 同站
("https", "example.com")("https", "sub.example.com")
("https", "example.com")("https", "sub.other.example.com")
("https", "example.com")("http", "non-secure.example.com")
("https", "r.wildlife.museum")("https", "sub.r.wildlife.museum")
("https", "r.wildlife.museum")("https", "sub.other.r.wildlife.museum")
("https", "r.wildlife.museum")("https", "other.wildlife.museum")
("https", "r.wildlife.museum")("https", "wildlife.museum")
("https", "wildlife.museum")("https", "wildlife.museum")
("https", "example.com")("https", "example.com.")

(此处省略了 端口域名 部分,因为它们不会被考虑在内。)

7.1.1.2 放宽同源限制
document.domain [ = domain ]

返回当前用于安全检查的域名。

可以设置为移除子域名的值,以将 域名 更改为允许同一域名下的其他子域名上的页面(如果它们执行相同的操作)相互访问。这使同一域名不同主机上的页面能够同步访问彼此的 DOM。

在沙盒化 iframe 中,带有 不透明源Document 以及没有 浏览上下文Document,设置器会抛出 "SecurityError" 异常。在 crossOriginIsolatedoriginAgentCluster 返回 true 的情况下,设置器将不执行任何操作。

避免使用 document.domain 设置器。它会削弱同源策略提供的安全保护。这在使用共享托管时尤其严重;例如,如果不受信任的第三方能够在同一 IP 地址但不同端口上托管 HTTP 服务器,则通常保护同一主机上两个不同站点的同源保护将失效,因为在比较源后,端口会被忽略 document.domain 设置器已使用。

由于这些安全缺陷,此功能正在从 Web 平台中删除。(这是一个需要多年时间才能完成的漫长过程。)

相反,请使用 postMessage()MessageChannel 对象以安全的方式跨源通信。

domain 获取器的步骤为

  1. effectiveDomainthis有效域名

  2. 如果 effectiveDomain 为 null,则返回空字符串。

  3. 返回 effectiveDomain序列化

domain 设置器的步骤为

  1. 如果 this浏览上下文 为 null,则抛出 "SecurityError" DOMException

  2. 如果 this活动沙盒标志集 已设置其 沙盒化 document.domain 浏览上下文标志,则抛出 "SecurityError" DOMException

  3. effectiveDomainthis有效域名

  4. 如果 effectiveDomain 为 null,则抛出 "SecurityError" DOMException

  5. 如果给定值 不是 effectiveDomain 的可注册域名后缀,也不等于 effectiveDomain,则抛出 "SecurityError" DOMException

  6. 如果 周围代理代理集群是否源键控 为 true,则返回。

  7. this域名 设置为 解析 给定值的 结果。

要确定 标量值字符串 hostSuffixString 是否为可注册域名后缀,或是否等于 主机 originalHost

  1. 如果 hostSuffixString 为空字符串,则返回 false。

  2. hostSuffix解析 hostSuffixString 的结果。

  3. 如果 hostSuffix 为 failure,则返回 false。

  4. 如果 hostSuffix等于 originalHost,则

    1. 如果 hostSuffixoriginalHost 不是 域名,则返回 false。

      这排除了 主机,这些主机是 IP 地址

    2. 如果 hostSuffix 在其前面加上 U+002E (.) 后,不匹配 originalHost 的结尾,则返回 false。

    3. 如果以下任何一项为真

      则返回 false。 [URL]

    4. 断言originalHost公共后缀 在其前面加上 U+002E (.) 后,匹配 hostSuffix 的结尾。

  5. 返回 true。

hostSuffixStringoriginalHost是否为可注册域名后缀,或是否等于 的结果注释
"0.0.0.0"0.0.0.0
"0x10203"0.1.2.3
"[0::1]"::1
"example.com"example.com
"example.com"example.com.尾随点很重要。
"example.com."example.com
"example.com"www.example.com
"com"example.com在撰写本文时,com 是一个公共后缀。
"example"example
"compute.amazonaws.com"example.compute.amazonaws.com在撰写本文时,*.compute.amazonaws.com 是一个公共后缀。
"example.compute.amazonaws.com"www.example.compute.amazonaws.com
"amazonaws.com"www.example.compute.amazonaws.com
"amazonaws.com"test.amazonaws.com在撰写本文时,amazonaws.com 是一个可注册域名。

7.1.2 源键控代理集群

window.originAgentCluster

如果此 Window 属于以本节所述方式 -键控代理集群,则返回 true。

通过使用 `Origin-Agent-Cluster` HTTP 响应头,在 安全上下文 中传递的 文档 可以请求将其置于 来源-键控 代理集群 中。此头字段是一个 结构化头字段,其值必须是一个 布尔值[STRUCTURED-FIELDS]

根据 创建和初始化新的 Document 对象 中的处理模型,不是 结构化头字段布尔值 true 值(即 `?1`)的值将被忽略。

使用此头字段的后果是,生成的 文档代理集群键 是其 来源,而不是 相应的站点。就可观察到的影响而言,这意味着尝试使用 document.domain 放宽同源限制 将不会产生任何效果,并且无法将 WebAssembly.Module 对象发送到跨源 文档(即使它们是 同一站点)。在幕后,这种隔离可以允许用户代理更有效地分配与 代理集群 相对应的特定于实现的资源,例如进程或线程。

请注意,在 浏览上下文组 中,`Origin-Agent-Cluster` 头字段永远不会导致同源 文档 对象最终位于不同的 代理集群 中,即使其中一个发送头字段而另一个没有发送。这是通过 历史代理集群键映射 来阻止的。

这意味着,即使设置了头字段,如果在同一个 浏览上下文组 中先前加载的同源页面上省略了头字段,originAgentCluster 获取器可能会返回 false。类似地,即使没有设置头字段,它也可能返回 true。

originAgentCluster 获取器的步骤是返回 周围代理代理集群是否来源键控

文档 具有 不透明来源 可以被认为是无条件的来源键控;对于它们,头字段没有任何效果,并且 originAgentCluster 获取器将始终返回 true。

类似地,文档 whose 代理集群跨源隔离模式 不是 "none" 会自动成为来源键控。`Origin-Agent-Cluster` 头字段可能对实现资源分配提供额外的提示,因为用于实现跨源隔离的 `Cross-Origin-Opener-Policy` 和 `Cross-Origin-Embedder-Policy` 头字段更多地是关于确保同一地址空间中的所有内容都选择加入。但是添加它不会对作者代码产生额外的可观察效果。

7.1.3 跨源打开者策略

一个 打开者策略值 允许在 顶级浏览上下文 中导航到的文档强制创建新的 顶级浏览上下文,以及相应的 。可能的值是

"unsafe-none"

这是(当前)默认值,这意味着文档将与前一个文档占据相同的 顶级浏览上下文,除非该文档指定了不同的 打开者策略

"same-origin-allow-popups"

这将强制为文档创建一个新的 顶级浏览上下文,除非其前一个文档指定了相同的 打开者策略 并且它们是 同源

"same-origin"

这与 "same-origin-allow-popups" 的行为相同,此外,创建的任何 辅助浏览上下文 都需要包含 同源 文档,这些文档也具有相同的 打开者策略,否则它将对打开者显示为已关闭。

"same-origin-plus-COEP"

这与 "same-origin" 的行为相同,此外,它将 (新) 顶级浏览上下文跨源隔离模式 设置为 "logical" 或 "concrete" 中的一个。

"same-origin-plus-COEP" 不能通过 `Cross-Origin-Opener-Policy` 头字段直接设置,而是通过同时设置 `Cross-Origin-Opener-Policy: same-origin` 和一个值为 与跨源隔离兼容 的 `Cross-Origin-Embedder-Policy` 头字段来实现。

一个 打开者策略 由以下部分组成

匹配打开者策略值,给定一个 打开者策略值 A,一个 来源 originA,一个 打开者策略值 B,以及一个 来源 originB

  1. 如果 A 是 "unsafe-none" 并且 B 是 "unsafe-none",则返回 true。

  2. 如果 A 是 "unsafe-none" 或 B 是 "unsafe-none",则返回 false。

  3. 如果 A 等于 B 并且 originAoriginB同源,则返回 true。

  4. 返回 false。

7.1.3.1 头字段

头字段/Cross-Origin-Opener-Policy

所有当前引擎中均支持。

Firefox79+Safari15.2+Chrome83+
OperaNoEdge83+
Edge (Legacy)?Internet ExplorerNo
Firefox Android?Safari iOS?Chrome Android?WebView AndroidNoSamsung Internet?Opera AndroidNo

一个 文档跨源打开者策略 来自 `Cross-Origin-Opener-Policy` 和 `Cross-Origin-Opener-Policy-Report-Only` HTTP 响应头。这些头字段是 结构化头字段,其值必须是一个 标记[STRUCTURED-FIELDS]

有效的 标记 值是 打开者策略值。标记还可能附带 参数;其中,"report-to" 参数可以具有一个 有效的 URL 字符串,用于标识适当的报告端点。 [REPORTING]

根据下面描述的处理模型,如果头字段包含无效值,用户代理将忽略此头字段。同样,如果值无法解析为 标记,用户代理将忽略此头字段。


获取打开者策略,给定一个 响应 response 和一个 环境 reservedEnvironment

  1. policy 是一个新的 打开者策略

  2. 如果 reservedEnvironment 是一个 非安全上下文,则返回 policy

  3. parsedItem获取结构化字段值 的结果,其中给出的是 `Cross-Origin-Opener-Policy` 和 “item” 从 response头列表 中。

  4. 如果 parsedItem 不为 null,则

    1. 如果 parsedItem[0] 为 “same-origin”,则

      1. coep获取跨域嵌入者策略 的结果,其中给出的是 responsereservedEnvironment

      2. 如果 coep跨域隔离兼容,则将 policy 设置为 “same-origin-plus-COEP”。

      3. 否则,将 policy 设置为 “same-origin”。

    2. 如果 parsedItem[0] 为 “same-origin-allow-popups”,则将 policy 设置为 “same-origin-allow-popups”。

    3. 如果 parsedItem[1]["report-to"] 存在 并且是一个字符串,则将 policy报告端点 设置为 parsedItem[1]["report-to"]。

  5. parsedItem 设置为 获取结构化字段值 的结果,其中给出的是 `Cross-Origin-Opener-Policy-Report-Only` 和 “item” 从 response头列表 中。

  6. 如果 parsedItem 不为 null,则

    1. 如果 parsedItem[0] 为 “same-origin”,则

      1. coep获取跨域嵌入者策略 的结果,其中给出的是 responsereservedEnvironment

      2. 如果 coep跨域隔离兼容coep仅报告值跨域隔离兼容,则将 policy仅报告值 设置为 “same-origin-plus-COEP”。

        仅报告 COOP 还考虑仅报告 COEP 以分配特殊的 “same-origin-plus-COEP” 值。这允许开发人员在部署 COOP 和 COEP 的顺序方面拥有更大的自由度。

      3. 否则,将 policy仅报告值 设置为 “same-origin”。

    2. 如果 parsedItem[0] 为 “same-origin-allow-popups”,则将 policy仅报告值 设置为 “same-origin-allow-popups”。

    3. 如果 parsedItem[1]["report-to"] 存在 并且是一个字符串,则将 policy仅报告报告端点 设置为 parsedItem[1]["report-to"]。

  7. 返回 policy

7.1.3.2 由于打开程序策略导致的浏览上下文组切换

为了 检查 COOP 值是否需要浏览上下文组切换,给定布尔值 isInitialAboutBlank,两个 来源 responseOriginactiveDocumentNavigationOrigin,以及两个 打开程序策略值 responseCOOPValueactiveDocumentCOOPValue

  1. 如果 匹配 activeDocumentCOOPValueactiveDocumentNavigationOriginresponseCOOPValueresponseOrigin 的结果为 true,则返回 false。

  2. 如果以下所有条件都为真

    则返回 false。

  3. 返回 true。

为了 检查强制执行仅报告 COOP 是否需要浏览上下文组切换,给定布尔值 isInitialAboutBlank,两个 来源 responseOriginactiveDocumentNavigationOrigin,以及两个 打开程序策略 responseCOOPactiveDocumentCOOP

  1. 如果 检查 COOP 值是否需要浏览上下文组切换 的结果为 false,其中给出的是 isInitialAboutBlankresponseOriginactiveDocumentNavigationOriginresponseCOOP仅报告值activeDocumentCOOPReportOnly仅报告值,则返回 false。

    匹配仅报告策略允许网站在其所有页面上指定相同的仅报告打开程序策略,并且不会因这些页面之间的导航而收到违规报告。

  2. 如果 检查 COOP 值是否需要浏览上下文组切换 的结果为 true,其中给出的是 isInitialAboutBlankresponseOriginactiveDocumentNavigationOriginresponseCOOPactiveDocumentCOOPReportOnly仅报告值,则返回 true。

  3. 如果 检查 COOP 值是否需要浏览上下文组切换 的结果为 true,其中给出的是 isInitialAboutBlankresponseOriginactiveDocumentNavigationOriginresponseCOOP仅报告值activeDocumentCOOPReportOnly,则返回 true。

  4. 返回 false。

一个 打开程序策略执行结果 是一个具有以下 结构体

为了 强制执行响应的打开程序策略,给定一个 浏览上下文 browsingContext,一个 URL responseURL,一个 来源 responseOrigin,一个 打开程序策略 responseCOOP,一个 打开程序策略执行结果 currentCOOPEnforcementResult,以及一个 来源 referrer

  1. newCOOPEnforcementResult 为一个新的具有以下内容的 打开程序策略执行结果

    需要浏览上下文组切换
    currentCOOPEnforcementResult需要浏览上下文组切换
    由于仅报告而需要浏览上下文组切换
    currentCOOPEnforcementResult由于仅报告而需要浏览上下文组切换
    url
    responseURL
    来源
    responseOrigin
    打开程序策略
    responseCOOP
    当前上下文是导航源
    true
  2. isInitialAboutBlankbrowsingContext活动文档是初始 about:blank

  3. 如果 isInitialAboutBlank 为 true 并且 browsingContext初始 URL 为 null,则将 browsingContext初始 URL 设置为 responseURL

  4. 如果 检查 COOP 值是否需要浏览上下文组切换 的结果为 true,其中给出的是 isInitialAboutBlankcurrentCOOPEnforcementResult打开程序策略currentCOOPEnforcementResult来源responseCOOPresponseOrigin,则

    1. newCOOPEnforcementResult需要浏览上下文组切换 设置为 true。

    2. 如果 browsingContext浏览上下文集大小 大于 1,则

      1. 将违规报告排队到导航到 COOP 响应时,其中给出的是 responseCOOP、“enforce”、responseURLcurrentCOOPEnforcementResulturlcurrentCOOPEnforcementResult来源responseOriginreferrer

      2. 当从 COOP 响应导航离开时,为浏览上下文组切换排队一个违规报告,使用 currentCOOPEnforcementResultopener 策略,“enforce”,currentCOOPEnforcementResulturlresponseURLcurrentCOOPEnforcementResultoriginresponseOrigin,以及 currentCOOPEnforcementResult当前上下文是导航源

  5. 如果 检查强制 report-only COOP 是否需要浏览上下文组切换 的结果,在给定 isInitialAboutBlankresponseOrigincurrentCOOPEnforcementResultoriginresponseCOOP 以及 currentCOOPEnforcementResultopener 策略 的情况下为真,则

    1. result由于 report-only 需要浏览上下文组切换 设置为真。

    2. 如果 browsingContextgroup浏览上下文集大小 大于 1,则

      1. 当导航到 COOP 响应时,为浏览上下文组切换排队一个违规报告,使用 responseCOOP,“reporting”,responseURLcurrentCOOPEnforcementResulturlcurrentCOOPEnforcementResultoriginresponseOrigin,以及 referrer

      2. 当从 COOP 响应导航离开时,为浏览上下文组切换排队一个违规报告,使用 currentCOOPEnforcementResultopener 策略,“reporting”,currentCOOPEnforcementResulturlresponseURLcurrentCOOPEnforcementResultoriginresponseOrigin,以及 currentCOOPEnforcementResult当前上下文是导航源

  6. 返回 newCOOPEnforcementResult

为了 获得用于导航响应的浏览上下文,在给定 浏览上下文 browsingContext沙盒标志集 sandboxFlagsopener 策略 navigationCOOP 以及 opener 策略强制结果 coopEnforcementResult

  1. 如果 browsingContext 不是 顶级浏览上下文,则返回 browsingContext

  2. 如果 coopEnforcementResult需要浏览上下文组切换 为假,则

    1. 如果 coopEnforcementResult由于 report-only 需要浏览上下文组切换 为真,则将 browsing context虚拟浏览上下文组 ID 设置为新的唯一标识符。

    2. 返回 browsingContext

  3. newBrowsingContext创建新的顶级浏览上下文和文档 的第一个返回值。

    在这种情况下,我们将执行浏览上下文组交换。browsingContext 将不会被我们即将要 创建 的新的 Document 使用。如果它也不被其他 Document(例如,后向/前向缓存中的那些)使用,则用户代理可能会在此时 销毁它

  4. 如果 navigationCOOP 为 "same-origin-plus-COEP",则将 newBrowsingContextgroup跨源隔离模式 设置为 "logical" 或 "concrete"。选择哪一个是 实现定义的

    在某些平台上,很难提供 跨源隔离功能 所需的安全属性。"concrete" 授予对它的访问权限,而 "logical" 则不授予。

  5. 如果 sandboxFlags 不为空,则

    1. 断言navigationCOOP 为 "unsafe-none"。

    2. 断言newBrowsingContext弹出窗口沙盒标志集 为空

    3. newBrowsingContext弹出窗口沙盒标志集 设置为 sandboxFlags克隆

  6. 返回 newBrowsingContext

7.1.3.3 报告

一个 访问者-被访问者关系 是一个枚举,它描述了两个 浏览上下文 之间的关系,这两个上下文之间发生了访问。它可以采用以下值

访问者是打开者

访问者 浏览上下文 或其 祖先 之一是被访问者 浏览上下文打开者浏览上下文顶级浏览上下文

访问者是被打开者

被访问者 浏览上下文 或其 祖先 之一是访问者 浏览上下文顶级浏览上下文打开者浏览上下文

访问者 浏览上下文、被访问者 浏览上下文 或它们的任何 祖先 之间没有打开者关系。

为了 检查两个浏览上下文之间的访问是否应该被报告,在给定两个 浏览上下文 accessoraccessed、一个 JavaScript 属性名称 P 以及一个 环境设置对象 environment

  1. 如果 P 不是 跨源可访问的窗口属性名称,则返回。

  2. 断言accessor活动文档accessed活动文档 都是 完全活动的

  3. accessorTopDocumentaccessor顶级浏览上下文活动文档

  4. accessorInclusiveAncestorOrigins 为通过获取 accessor活动文档包含祖先可导航元素 中每个元素的 origin 获得的列表。

  5. accessedTopDocumentaccessed顶级浏览上下文活动文档

  6. accessedInclusiveAncestorOrigins 为通过获取 accessed活动文档包含祖先可导航元素 中每个元素的 origin 获得的列表。

  7. 如果 accessorInclusiveAncestorOrigins 中的任何元素与 accessorTopDocumentorigin 同源,或者如果 accessedInclusiveAncestorOrigins 中的任何元素与 accessedTopDocumentorigin 同源,则返回。

    这避免了将跨源 iframe 的信息泄露给具有 opener 策略报告的顶级框架。

  8. 如果 accessor顶级浏览上下文虚拟浏览上下文组 IDaccessed顶级浏览上下文虚拟浏览上下文组 ID,则返回。

  9. accessorAccessedRelationship 为一个新的 访问者-被访问者关系,其值为

  10. 如果 accessed顶级浏览上下文打开者浏览上下文accessoraccessor祖先,则将 accessorAccessedRelationship 设置为 访问者是打开者

  11. 如果 accessor顶级浏览上下文打开者浏览上下文accessedaccessed祖先,则将 accessorAccessedRelationship 设置为 访问者是被打开者

  12. 根据 accessorAccessedRelationshipaccessorTopDocument打开者策略accessedTopDocument打开者策略accessor活动文档URLaccessed活动文档URLaccessor顶级浏览上下文初始 URLaccessed顶级浏览上下文初始 URLaccessor活动文档accessed活动文档accessor顶级浏览上下文创建时的打开者源accessed顶级浏览上下文创建时的打开者源accessorTopDocumentreferreraccessedTopDocumentreferrerPenvironment将访问的违规报告加入队列

给定一个 URL url将 URL 清理以发送到报告中

  1. sanitizedURL 设置为 url 的副本。

  2. 根据 sanitizedURL 和空字符串,设置用户名

  3. 根据 sanitizedURL 和空字符串,设置密码

  4. 返回 sanitizedURL序列化,并将 排除片段 设置为 true。

给定一个 打开者策略 coop、字符串 dispositionURL coopURLURL previousResponseURL、两个 coopOriginpreviousResponseOrigin 以及一个 referrer referrer将导航到 COOP 响应时浏览上下文组切换的违规报告加入队列

  1. 如果 coop报告端点 为 null,则返回。

  2. coopValue 设置为 coop

  3. 如果 disposition 为 "reporting",则将 coopValue 设置为 coop仅报告值

  4. serializedReferrer 设置为空字符串。

  5. 如果 referrer 是一个 URL,则将 serializedReferrer 设置为 referrer序列化

  6. body 设置为一个包含以下属性的新对象。

    keyvalue
    dispositiondisposition
    effectivePolicycoopValue
    previousResponseURL如果 coopOriginpreviousResponseOrigin 同源,则这是 previousResponseURL清理,否则为 null。
    referrerserializedReferrer
    type"navigation-to-response"
  7. body 作为 "coop" 加入队列,用于 coop报告端点,并附带 coopURL

给定一个 打开者策略 coop、字符串 dispositionURL coopURLURL nextResponseURL、两个 coopOriginnextResponseOrigin 以及一个布尔值 isCOOPResponseNavigationSource将从 COOP 响应导航时浏览上下文组切换的违规报告加入队列

  1. 如果 coop报告端点 为 null,则返回。

  2. coopValue 设置为 coop

  3. 如果 disposition 为 "reporting",则将 coopValue 设置为 coop仅报告值

  4. body 设置为一个包含以下属性的新对象。

    keyvalue
    dispositiondisposition
    effectivePolicycoopValue
    nextResponseURL如果 coopOriginnextResponseOrigin 同源isCOOPResponseNavigationSource 为 true,则这是 previousResponseURL清理,否则为 null。
    type"navigation-from-response"
  5. body 作为 "coop" 加入队列,用于 coop报告端点,并附带 coopURL

给定一个 访问者-被访问者关系 accessorAccessedRelationship、两个 打开者策略 accessorCOOPaccessedCOOP、四个 URL accessorURLaccessedURLaccessorInitialURLaccessedInitialURL、四个 accessorOriginaccessedOriginaccessorCreatorOriginaccessedCreatorOrigin、两个 referrer accessorReferreraccessedReferrer、字符串 propertyName 以及 环境设置对象 environment将访问的违规报告加入队列

  1. 如果 coop报告端点 为 null,则返回。

  2. coopValue 设置为 coop

  3. 如果 disposition 为 "reporting",则将 coopValue 设置为 coop仅报告值

  4. 如果 accessorAccessedRelationship访问者是打开者

    1. 根据 accessorCOOPaccessorURLaccessedURLaccessedInitialURLaccessorOriginaccessedOriginaccessedCreatorOriginpropertyNameenvironment将访问打开窗口的违规报告加入队列

    2. 根据 accessedCOOPaccessedURLaccessorURLaccessedOriginaccessorOriginpropertyNameaccessedReferrer将从打开者访问的违规报告加入队列

  5. 否则,如果 accessorAccessedRelationship访问者是被打开者

    1. 根据 accessorCOOPaccessorURLaccessedURLaccessorOriginaccessedOriginpropertyNameaccessorReferrerenvironment将访问打开者的违规报告加入队列

    2. 根据 accessedCOOPaccessedURLaccessorURLaccessorInitialURLaccessedOriginaccessorOriginaccessorCreatorOriginpropertyName将从打开窗口访问的违规报告加入队列

  6. 否则

    1. 根据 accessorCOOPaccessorURLaccessedURLaccessorOriginaccessedOriginpropertyNameenvironment将访问其他窗口的违规报告加入队列

    2. 根据 accessedCOOPaccessedURLaccessorURLaccessedOriginaccessorOriginpropertyName将从其他窗口访问的违规报告加入队列

给定一个 打开者策略 coop、两个 URL coopURLopenerURL、两个 coopOriginopenerOrigin、字符串 propertyName、一个 referrer referrer 以及一个 环境设置对象 environment将访问打开者的违规报告加入队列

  1. sourceFilelineNumbercolumnNumber 设置为触发该报告的相关脚本 URL 和问题位置。

  2. serializedReferrer 设置为空字符串。

  3. 如果 referrer 是一个 URL,则将 serializedReferrer 设置为 referrer序列化

  4. body 设置为一个包含以下属性的新对象。

    keyvalue
    disposition"reporting"
    effectivePolicycoop仅报告值
    propertypropertyName
    openerURL如果 coopOriginopenerOrigin 同源,则这是 openerURL清理,否则为 null。
    referrerserializedReferrer
    sourceFilesourceFile
    lineNumberlineNumber
    columnNumbercolumnNumber
    type"access-to-opener"
  5. body 作为 "coop" 加入队列,用于 coop报告端点,并附带 coopURLenvironment

为访问打开的窗口排队违规报告,给定一个 打开者策略 coop,三个 URL coopURLopenedWindowURLinitialWindowURL,三个 来源 coopOriginopenedWindowOriginopenerInitialOrigin,一个字符串 propertyName 和一个 环境设置对象 environment

  1. sourceFilelineNumbercolumnNumber 设置为触发该报告的相关脚本 URL 和问题位置。

  2. body 设置为一个包含以下属性的新对象。

    keyvalue
    disposition"reporting"
    effectivePolicycoop仅报告值
    propertypropertyName
    openedWindowURL如果 coopOriginopenedWindowOrigin相同来源,则这是 openedWindowURL清理,否则为 null。
    openedWindowInitialURL如果 coopOriginopenerInitialOrigin相同来源,则这是 initialWindowURL清理,否则为 null。
    sourceFilesourceFile
    lineNumberlineNumber
    columnNumbercolumnNumber
    type"access-to-opener"
  3. 排队 body 作为 "coop" 用于 coop报告端点,并使用 coopURLenvironment

为访问另一个窗口排队违规报告,给定一个 打开者策略 coop,两个 URL coopURLotherURL,两个 来源 coopOriginotherOrigin,一个字符串 propertyName 和一个 环境设置对象 environment

  1. sourceFilelineNumbercolumnNumber 设置为触发该报告的相关脚本 URL 和问题位置。

  2. body 设置为一个包含以下属性的新对象。

    keyvalue
    disposition"reporting"
    effectivePolicycoop仅报告值
    propertypropertyName
    otherURL如果 coopOriginotherOrigin相同来源,则这是 otherURL清理,否则为 null。
    sourceFilesourceFile
    lineNumberlineNumber
    columnNumbercolumnNumber
    type"access-to-opener"
  3. 排队 body 作为 "coop" 用于 coop报告端点,并使用 coopURLenvironment

为来自打开者的访问排队违规报告,给定一个 打开者策略 coop,两个 URL coopURLopenerURL,两个 来源 coopOriginopenerOrigin,一个字符串 propertyName 和一个 推荐者 referrer

  1. 如果 coop报告端点 为 null,则返回。

  2. serializedReferrer 设置为空字符串。

  3. 如果 referrer 是一个 URL,则将 serializedReferrer 设置为 referrer序列化

  4. body 设置为一个包含以下属性的新对象。

    keyvalue
    disposition"reporting"
    effectivePolicycoop仅报告值
    propertypropertyName
    openerURL如果 coopOriginopenerOrigin相同来源,则这是 openerURL清理,否则为 null。
    referrerserializedReferrer
    type"access-to-opener"
  5. 排队 body 作为 "coop" 用于 coop报告端点,并使用 coopURL

为来自打开的窗口的访问排队违规报告,给定一个 打开者策略 coop,三个 URL coopURLopenedWindowURLinitialWindowURL,三个 来源 coopOriginopenedWindowOriginopenerInitialOrigin,以及一个字符串 propertyName

  1. 如果 coop报告端点 为 null,则返回。

  2. body 设置为一个包含以下属性的新对象。

    keyvalue
    disposition"reporting"
    effectivePolicycoopValue
    propertycoop仅报告值
    openedWindowURL如果 coopOriginopenedWindowOrigin相同来源,则这是 openedWindowURL清理,否则为 null。
    openedWindowInitialURL如果 coopOriginopenerInitialOrigin相同来源,则这是 initialWindowURL清理,否则为 null。
    type"access-to-opener"
  3. 排队 body 作为 "coop" 用于 coop报告端点,并使用 coopURL

为来自另一个窗口的访问排队违规报告,给定一个 打开者策略 coop,两个 URL coopURLotherURL,两个 来源 coopOriginotherOrigin,以及一个字符串 propertyName

  1. 如果 coop报告端点 为 null,则返回。

  2. body 设置为一个包含以下属性的新对象。

    keyvalue
    disposition"reporting"
    effectivePolicycoop仅报告值
    propertypropertyName
    otherURL如果 coopOriginotherOrigin相同来源,则这是 otherURL清理,否则为 null。
    typeaccess-to-opener
  3. 排队 body 作为 "coop" 用于 coop报告端点,并使用 coopURL

7.1.4 跨源嵌入器策略

标题/跨源嵌入器策略

所有当前引擎中均支持。

Firefox79+Safari15.2+Chrome83+
Opera?Edge83+
Edge (Legacy)?Internet ExplorerNo
Firefox Android?Safari iOS?Chrome Android?WebView Android86+Samsung Internet?Opera Android?

一个 嵌入器策略值 是三个字符串之一,它控制在没有资源所有者明确许可的情况下获取跨源资源。

"unsafe-none"

这是默认值。当使用此值时,可以获取跨源资源,而无需通过 CORS 协议 或 `Cross-Origin-Resource-Policy` 头部提供明确的许可。

"require-corp"

当使用此值时,获取跨源资源需要服务器通过 CORS 协议 或 `Cross-Origin-Resource-Policy` 头部提供明确的许可。

"credentialless"

当使用此值时,获取跨源非 CORS 资源会省略凭据。作为交换,不需要显式 `Cross-Origin-Resource-Policy` 头部。其他带有凭据的请求需要服务器通过 CORS 协议 或 `Cross-Origin-Resource-Policy` 头部提供明确的许可。

在支持 "credentialless" 之前,实施者强烈建议支持以下两种情况:

否则,攻击者将能够利用客户端的网络位置来读取非公开资源,使用 跨源隔离功能

一个 嵌入器策略值 如果是 "credentialless" 或 "require-corp",则 与跨源隔离兼容

一个 嵌入器策略 由以下部分组成:

"coep" 报告类型 是一个 报告类型,其值为 "coep"。它 ReportingObserver 可见

7.1.4.1 标头

`Cross-Origin-Embedder-Policy` 和 `Cross-Origin-Embedder-Policy-Report-Only` HTTP 响应头允许服务器为一个 环境设置对象 声明一个 嵌入器策略。这些头是 结构化头,其值必须是 标记[STRUCTURED-FIELDS]

有效的 标记 值是 嵌入器策略值。标记也可能附加有 参数;其中,"report-to" 参数可以有一个 有效的 URL 字符串,用于识别适当的报告端点。 [REPORTING]

处理模型 在遇到无法解析为标记的标题时,会进行失败打开(默认为 "unsafe-none")。这包括在给定响应中组合多个 `Cross-Origin-Embedder-Policy` 头部实例而意外创建的列表

`Cross-Origin-Embedder-Policy`最终的 嵌入器策略值
没有交付的标题"unsafe-none"
`require-corp`"require-corp"
`unknown-value`"unsafe-none"
`require-corp, unknown-value`"unsafe-none"
`unknown-value, unknown-value`"unsafe-none"
`unknown-value, require-corp`"unsafe-none"
`require-corp, require-corp`"unsafe-none"

(这同样适用于 `Cross-Origin-Embedder-Policy-Report-Only`.)


要从 获取嵌入器策略,需要提供一个 响应 response 和一个 环境 environment

  1. policy 为一个新的 嵌入器策略

  2. 如果 environment 是一个 非安全上下文,则返回 policy

  3. parsedItem 为使用 Cross-Origin-Embedder-Policy 和 "item" 从 response头部列表获取结构化字段值 的结果。

  4. 如果 parsedItem 不为空且 parsedItem[0] 与跨域隔离兼容

    1. policy 设置为 parsedItem[0]。

    2. 如果 parsedItem[1]["report-to"] 存在,则将 policy端点 设置为 parsedItem[1]["report-to"]。

  5. parsedItem 为使用 Cross-Origin-Embedder-Policy-Report-Only 和 "item" 从 response头部列表获取结构化字段值 的结果。

  6. 如果 parsedItem 不为空且 parsedItem[0] 与跨域隔离兼容

    1. policy仅报告值 设置为 parsedItem[0]。

    2. 如果 parsedItem[1]["report-to"] 存在,则将 policy端点 设置为 parsedItem[1]["report-to"]。

  7. 返回 policy

7.1.4.2 嵌入器策略检查

检查导航响应是否符合其嵌入器策略,需要提供一个 响应 response,一个 可导航对象 navigable 和一个 嵌入器策略 responsePolicy

  1. 如果 navigable 不是一个 子可导航对象,则返回 true。

  2. parentPolicynavigable容器文档策略容器嵌入器策略

  3. 如果 parentPolicy仅报告值 与跨域隔离兼容responsePolicy 不兼容,则 将跨域嵌入器策略继承违规事件加入队列,并传入 response、"navigation"、parentPolicy仅报告端点、"reporting" 和 navigable容器文档相关设置对象

  4. 如果 parentPolicy 与跨域隔离不兼容responsePolicy 与跨域隔离兼容,则返回 true。

  5. 将跨域嵌入器策略继承违规事件加入队列,并传入 response、"navigation"、parentPolicy端点、"enforce" 和 navigable容器文档相关设置对象

  6. 返回 false。

检查全局对象的嵌入器策略,需要提供一个 WorkerGlobalScope workerGlobalScope,一个 环境设置对象 owner 和一个 响应 response

  1. 如果 workerGlobalScope 不是一个 DedicatedWorkerGlobalScope 对象,则返回 true。

  2. policyworkerGlobalScope嵌入器策略

  3. ownerPolicyowner策略容器嵌入器策略

  4. 如果 ownerPolicy仅报告值 与跨域隔离兼容policy 不兼容,则 将跨域嵌入器策略继承违规事件加入队列,并传入 response、"worker initialization"、ownerPolicy仅报告端点、"reporting" 和 owner

  5. 如果 ownerPolicy 与跨域隔离不兼容policy 与跨域隔离兼容,则返回 true。

  6. 将跨域嵌入器策略继承违规事件加入队列,并传入 response、"worker initialization"、ownerPolicy端点、"enforce" 和 owner

  7. 返回 false。

将跨域嵌入器策略继承违规事件加入队列,需要提供一个 响应 response,一个字符串 type,一个字符串 endpoint,一个字符串 disposition 和一个 环境设置对象 settings

  1. serialized 为使用 response 将响应 URL 序列化以用于报告 的结果。

  2. body 设置为一个包含以下属性的新对象。

    keyvalue
    typetype
    blockedURLserialized
    dispositiondisposition
  3. body 作为 "coep" 报告类型 添加到 endpointsettings 上的队列中。

7.1.5 沙箱

一个 沙箱标志集 是由零个或多个以下标志组成,用于限制潜在不可信资源的能力

一个 沙箱导航浏览上下文标志

此标志 阻止内容导航到沙箱浏览上下文以外的浏览上下文(或嵌套在其中的浏览上下文)、辅助浏览上下文(由下一个定义的 沙箱辅助导航浏览上下文标志 保护)和 顶级浏览上下文(由下面定义的 沙箱顶级无用户激活导航浏览上下文标志沙箱顶级有用户激活导航浏览上下文标志 保护)。

如果 沙箱辅助导航浏览上下文标志 未设置,则在某些情况下,限制仍然允许打开弹出窗口(新的 顶级浏览上下文)。这些 浏览上下文 始终具有 一个允许的沙箱导航器,在创建浏览上下文时设置,允许创建它们的 浏览上下文 实际导航它们。(否则,沙箱导航浏览上下文标志 将阻止它们被导航,即使它们被打开了。)

一个 沙箱辅助导航浏览上下文标志

此标志 阻止内容创建新的辅助浏览上下文,例如使用 target 属性或 window.open() 方法。

一个 沙箱顶级无用户激活导航浏览上下文标志

此标志 阻止内容在他们的 顶级浏览上下文 中进行导航,并且 阻止内容关闭他们的 顶级浏览上下文。它仅在沙箱浏览上下文的 活动窗口 没有 瞬时激活 时才被查询。

沙箱顶级导航无用户激活浏览上下文标志 设置时,内容可以在其 顶级浏览上下文 中导航,但其他 浏览上下文 仍然受 沙箱导航浏览上下文标志 和可能存在的 沙箱辅助导航浏览上下文标志 的保护。

沙箱顶级导航有用户激活浏览上下文标志

此标志 阻止内容在他们的 顶级浏览上下文 中进行导航,并且 阻止内容关闭他们的 顶级浏览上下文。它仅在沙箱浏览上下文的 活动窗口瞬时激活 时才被查询。

沙箱顶级导航无用户激活浏览上下文标志 一样,此标志仅影响 顶级浏览上下文;如果未设置它,其他 浏览上下文 可能仍受其他标志的保护。

沙箱来源浏览上下文标志

此标志 将内容强制为不透明来源,从而阻止它访问来自同一 来源 的其他内容。

此标志还 阻止脚本读取或写入 document.cookie IDL 属性,并阻止访问 localStorage

沙箱表单浏览上下文标志

此标志 阻止表单提交

沙箱指针锁定浏览上下文标志

此标志禁用指针锁定 API。 [POINTERLOCK]

沙箱脚本浏览上下文标志

此标志 阻止脚本执行

沙箱自动功能浏览上下文标志

此标志阻止自动触发功能,例如 自动播放视频自动聚焦表单控件

沙箱 document.domain 浏览上下文标志

此标志阻止内容使用 document.domain 设置器。

沙箱传播到辅助浏览上下文标志

此标志阻止内容通过确保其创建的任何 辅助浏览上下文 继承其内容的 活动沙箱标志集 来逃离沙箱。

沙箱模态标志

此标志阻止内容使用以下任何功能来生成模态对话框

沙箱方向锁定浏览上下文标志

此标志禁用锁定屏幕方向的功能。 [SCREENORIENTATION]

沙箱演示浏览上下文标志

此标志禁用演示 API。 [PRESENTATION]

沙箱下载浏览上下文标志

此标志阻止内容通过 下载超链接 或通过 导航(被视为 下载)来启动或实例化下载。

沙箱自定义协议导航浏览上下文标志

此标志阻止导航到非 fetch 方案传递给外部软件

当用户代理要 解析沙箱指令 时,给定一个字符串 input,一个 沙箱标志集 output,它必须运行以下步骤

  1. 按 ASCII 空格拆分 input,以获得 tokens

  2. output 为空。

  3. 将以下标志添加到 output


每个 顶级浏览上下文 都有一个 弹出式沙箱标志集,它是一个 沙箱标志集。当一个 浏览上下文 被创建时,它的 弹出式沙箱标志集 必须为空。它由 选择可导航的规则获取用于导航响应的浏览上下文 算法填充。

每个 iframe 元素都有一个 iframe 沙箱标志集,它是一个 沙箱标志集。在任何特定时间设置的 iframe 沙箱标志集 中的标志由 iframe 元素的 sandbox 属性决定。

每个 Document 都有一个 活动沙箱标志集,它是一个 沙箱标志集。当 Document 被创建时,它的 活动沙箱标志集 必须为空。它由 导航算法 填充。

每个 CSP 列表 cspList 都有 CSP 派生的沙箱标志,它是一个 沙箱标志集。它是以下算法的返回值

  1. directives 为一个空的 有序集

  2. 对于 cspList 中的每个策略

    1. 如果 policy处置 不是 "enforce",则 继续

    2. 如果 policy指令集 包含 一个名称为 "sandbox" 的 指令,则 追加 该指令到 directives

  3. 如果 directives 为空,则返回一个空的 沙箱标志集

  4. directivedirectives[directives大小 − 1]。

  5. 返回 解析沙箱指令 directive 的结果。


确定浏览上下文的创建沙箱标志 browsing context,给定 null 或元素 embedder,返回以下 沙箱标志集 中存在的标志的 并集

7.1.6 策略容器

一个 策略容器 是一个 结构体,包含应用于 DocumentWorkerGlobalScopeWorkletGlobalScope 的策略。它有以下

将其他策略移入策略容器。

克隆一个策略容器,给定一个 策略容器 policyContainer

  1. clone 为一个新的 策略容器

  2. 对于 policyContainerCSP 列表 中的每个 policy追加 policy 的副本到 cloneCSP 列表

  3. clone嵌入器策略 设置为 policyContainer嵌入器策略 的副本。

  4. clone推荐者策略 设置为 policyContainer推荐者策略

  5. 返回 clone

要确定一个 URL url 是否需要将策略容器存储在历史记录中

  1. 如果 url方案 是 "blob",则返回 false。

  2. 如果 url 是本地的,则返回 true。

  3. 返回 false。

从获取响应创建策略容器,给定一个 响应 response 和一个 环境-或-null environment

  1. 如果 responseURL方案 是 "blob",则返回 responseURLblob URL 条目环境策略容器克隆

  2. result 为一个新的 策略容器

  3. resultCSP 列表 设置为 解析响应的 Content Security Policies 的结果,给定 response

  4. 如果 environment 非空,则将 result嵌入器策略 设置为 获取嵌入器策略 的结果,给定 responseenvironment。否则,将其设置为 "unsafe-none"。

  5. result推荐者策略 设置为 解析 `Referrer-Policy` 头部 的结果,给定 response[REFERRERPOLICY]

  6. 返回 result

确定导航参数策略容器,给定一个 URL responseURL 和四个 策略容器-或-null historyPolicyContainerinitiatorPolicyContainerparentPolicyContainerresponsePolicyContainer

  1. 如果 historyPolicyContainer 非空,则

    1. 断言responseURL 需要将策略容器存储在历史记录中

    2. 返回 historyPolicyContainer克隆

  2. 如果 responseURLabout:srcdoc,则

    1. 断言parentPolicyContainer 非空。

    2. 返回 parentPolicyContainer克隆

  3. 如果 responseURL 是本地的 并且 initiatorPolicyContainer 非空,则返回 initiatorPolicyContainer克隆

  4. 如果 responsePolicyContainer 非空,则返回 responsePolicyContainer

  5. 返回一个新的 策略容器

初始化工作者全局作用域的策略容器,给定一个 WorkerGlobalScope workerGlobalScope、一个 响应 response 和一个 环境 environment

  1. 如果 workerGlobalScopeurl 是本地的 但其 方案 不是 "blob"

    1. 断言workerGlobalScope拥有者集大小 是 1。

    2. workerGlobalScope策略容器 设置为 workerGlobalScope所有者集[0] 的 相关设置对象策略容器克隆

  2. 否则,将 workerGlobalScope策略容器 设置为使用 responseenvironmentFetch 响应创建策略容器 的结果。