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 头部
      4. 7.1.4 跨源嵌入者策略
        1. 7.1.4.1 头部
      5. 7.1.5 沙箱

7 加载网页

7.1 支持的概念

7.1.1

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

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


一个 是以下之一

一个 不透明源

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

一个 元组源

一个 元组 包含

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

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

下表显示了两个 元组源 何时 同源 以及 同源域名 的示例。

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 字符串)和一个 主机(一个 主机)。

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

同源同源域名 概念不同,对于 无方案同站同站端口域名 组件将被忽略。

由于 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 对象以安全的方式跨源通信。

7.1.2 基于源的代理集群

window.originAgentCluster

如果此 Window 属于本节中描述的 代理集群,并且该集群是 -键控 的,则返回 true。

通过使用 `Origin-Agent-Cluster` HTTP 响应头,可以通过安全上下文交付的 Document 请求将其放入一个 -键控代理集群 中。此头是一个 结构化头,其值必须是一个 布尔值[STRUCTURED-FIELDS]

如果不是 结构化头布尔值 true 值(即 `?1`),则会被忽略。

使用此头的后果是,尝试使用 document.domain 放宽同源限制 将改为不执行任何操作,并且将无法将 WebAssembly.Module 对象发送到跨源 Document(即使它们是 同站)。在幕后,这种隔离可以允许用户代理更有效地分配对应于 代理集群 的特定于实现的资源,例如进程或线程。

请注意,在一个 浏览上下文组 中,`Origin-Agent-Cluster` 头永远不会导致同源 Document 对象最终位于不同的 代理集群 中,即使其中一个发送了头而另一个没有发送。

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

具有 不透明源Document 可以被认为是无条件地基于源的;对于它们,头没有任何影响,originAgentCluster getter 将始终返回 true。

类似地,如果 代理集群跨域隔离模式 不是 "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` 头部来实现,该头部的值为 与跨域隔离兼容

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

一个 Document跨域打开程序策略 来自 `Cross-Origin-Opener-Policy` 和 `Cross-Origin-Opener-Policy-Report-Only` HTTP 响应头部。这些头部是 结构化头部,其值必须是 令牌[STRUCTURED-FIELDS]

有效的 令牌 值是 打开程序策略值。令牌也可以附加 参数;其中,"report-to" 参数可以包含一个 有效的 URL 字符串,标识一个合适的报告端点。 [REPORTING]

如果头部包含无效的值,用户 代理将忽略该头部。同样地,如果值不能解析为 令牌,用户代理也会忽略该头部。

7.1.4 跨域嵌入程序策略

头部/Cross-Origin-Embedder-Policy

所有当前引擎都支持。

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",则它 与跨域隔离兼容

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` 同样适用)。

7.1.5 沙盒

一个 沙盒标志集 是一个包含零个或多个以下标志的集合,这些标志用于限制潜在不可信资源的能力

沙盒导航浏览上下文标志

此标志阻止内容导航到沙盒浏览上下文本身以外的浏览上下文(或嵌套在其中的浏览上下文)、辅助浏览上下文(受沙盒辅助导航浏览上下文标志保护,该标志在下面定义)以及顶级浏览上下文(受无用户激活的沙盒顶级导航浏览上下文标志有用户激活的沙盒顶级导航浏览上下文标志保护,这两个标志在下面定义)。

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

沙盒辅助导航浏览上下文标志

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

无用户激活的沙盒顶级导航浏览上下文标志

此标志阻止内容导航其顶级浏览上下文,并阻止内容关闭其顶级浏览上下文。只有当沙盒浏览上下文的活动窗口没有瞬时激活时才会考虑此标志。

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

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

此标志阻止内容导航其顶级浏览上下文,并阻止内容关闭其顶级浏览上下文。只有当沙盒浏览上下文的活动窗口具有瞬时激活时才会考虑此标志。

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

沙盒来源浏览上下文标志

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

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

沙盒表单浏览上下文标志

此标志阻止表单提交

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

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

沙盒脚本浏览上下文标志

此标志阻止脚本执行

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

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

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

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

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

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

沙盒模式标志

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

沙盒屏幕方向锁定浏览上下文标志

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

沙盒演示浏览上下文标志

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

沙盒下载浏览上下文标志

此标志阻止内容启动或实例化下载,无论是通过下载超链接还是通过被处理为下载导航

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

此标志阻止对非 fetch 方案的导航被移交给外部软件