动态标准 — 最后更新于 2024 年 9 月 12 日
本节介绍了最直接适用于网络浏览器的功能。尽管如此,除非另有说明,本节定义的要求确实适用于所有用户代理,无论它们是网络浏览器还是其他类型。
来源是网络安全模型的基本货币。在网络平台中,共享同一个来源的两个参与者被假定相互信任并具有相同的权限。来源不同的参与者被认为彼此之间可能具有敌意,并且在不同程度上相互隔离。
例如,如果托管在 bank.example.com
上的示例银行网站试图检查托管在 charity.example.org
上的示例慈善机构网站的 DOM,则会引发 "SecurityError
" DOMException
。
一个 来源 是以下之一
来源 可以共享,例如,在多个 Document
对象之间共享。此外,来源 通常是不可变的。只有 域 的 元组来源 可以更改,并且只能通过 document.domain
API 更改。
一个 来源 origin 的 有效域 按照以下步骤计算
一个 来源 的 序列化 是通过对给定的 来源 origin 应用以下算法获得的字符串
如果 origin 是一个 不透明来源,则返回 "null
"。
否则,令 result 为 origin 的 方案。
将 "://
" 附加到 result。
如果 origin 的 端口 不为空,则将 U+003A COLON 字符 (:) 和 origin 的 端口,序列化,附加到 result。
返回 result。
("https
", "xn--maraa-rta.example
", null, null) 的 序列化 是 "https://xn--maraa-rta.example
"。
以前还存在一个来源的 Unicode 序列化。但是,它从未被广泛采用。
两个 来源,A 和 B,如果以下算法返回 true,则被称为 同源
两个 来源,A 和 B,如果以下算法返回 true,则被称为 同源域
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 ") | ❌ | ❌ |
一个 方案和主机 是一个 元组,包含一个 方案(一个 ASCII 字符串)和一个 主机(一个 主机)。
要 获取一个站点,给定一个来源 origin,执行以下步骤
如果 origin 是一个 不透明来源,则返回 origin。
两个 站点,A 和 B,如果以下算法返回 true,则被称为 同站点
一个 站点 的 序列化 是通过对给定的 站点 site 应用以下算法获得的字符串
如果 site 是一个 不透明来源,则返回 "null
"。
令 result 为 site[0]。
将 "://
" 附加到 result。
将 site[1],序列化,附加到 result。
返回 result。
需要从上下文中明确,序列化值是一个站点,而不是一个来源,因为两者之间不一定存在语法上的区别。例如,来源 ("https
", "shop.example
", null, null) 和站点 ("https
", "shop.example
") 具有相同的序列化: "https://shop.example
"。
两个 来源,A 和 B,如果以下算法返回 true,则被称为 无方案同站点
两个 来源,A 和 B,如果以下算法返回 true,则被称为 同站点
与 同源 和 同源域 概念不同,对于 无协议同站 和 同站,端口 和 域名 部分会被忽略。
出于在 《URL》中解释 的原因,应尽可能避免使用 同站 和 无协议同站 概念,而应优先使用 同源 检查。
鉴于 wildlife.museum
、museum
和 com
是 公共后缀,而 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. ") | ❌ | ❌ |
document.domain [ = domain ]
返回当前用于安全检查的域名。
可以设置为移除子域名的值,以将 源 的 域名 更改为允许同一域名下的其他子域名上的页面(如果它们执行相同的操作)相互访问。这使同一域名不同主机上的页面能够同步访问彼此的 DOM。
在沙盒化 iframe
中,带有 不透明源 的 Document
以及没有 浏览上下文 的 Document
,设置器会抛出 "SecurityError
" 异常。在 crossOriginIsolated
或 originAgentCluster
返回 true 的情况下,设置器将不执行任何操作。
避免使用 document.domain
设置器。它会削弱同源策略提供的安全保护。这在使用共享托管时尤其严重;例如,如果不受信任的第三方能够在同一 IP 地址但不同端口上托管 HTTP 服务器,则通常保护同一主机上两个不同站点的同源保护将失效,因为在比较源后,端口会被忽略 document.domain
设置器已使用。
由于这些安全缺陷,此功能正在从 Web 平台中删除。(这是一个需要多年时间才能完成的漫长过程。)
相反,请使用 postMessage()
或 MessageChannel
对象以安全的方式跨源通信。
domain
获取器的步骤为
domain
设置器的步骤为
如果 this 的 浏览上下文 为 null,则抛出 "SecurityError
" DOMException
。
如果 this 的 活动沙盒标志集 已设置其 沙盒化 document.domain
浏览上下文标志,则抛出 "SecurityError
" DOMException
。
如果 effectiveDomain 为 null,则抛出 "SecurityError
" DOMException
。
如果给定值 不是 effectiveDomain 的可注册域名后缀,也不等于 effectiveDomain,则抛出 "SecurityError
" DOMException
。
要确定 标量值字符串 hostSuffixString 是否为可注册域名后缀,或是否等于 主机 originalHost
如果 hostSuffixString 为空字符串,则返回 false。
设 hostSuffix 为 解析 hostSuffixString 的结果。
如果 hostSuffix 为 failure,则返回 false。
如果 hostSuffix 不 等于 originalHost,则
返回 true。
hostSuffixString | originalHost | 是否为可注册域名后缀,或是否等于 的结果 | 注释 |
---|---|---|---|
"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 是一个可注册域名。 |
通过使用 `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
` 头字段更多地是关于确保同一地址空间中的所有内容都选择加入。但是添加它不会对作者代码产生额外的可观察效果。
一个 打开者策略值 允许在 顶级浏览上下文 中导航到的文档强制创建新的 顶级浏览上下文,以及相应的 组。可能的值是
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
` 头字段来实现。
一个 打开者策略 由以下部分组成
一个 值,它是一个 打开者策略值,最初为 "unsafe-none
"。
一个 报告端点,它是一个字符串或 null,最初为 null。
一个 只报告值,它是一个 打开者策略值,最初为 "unsafe-none
"。
一个 只报告报告端点,它是一个字符串或 null,最初为 null。
要 匹配打开者策略值,给定一个 打开者策略值 A,一个 来源 originA,一个 打开者策略值 B,以及一个 来源 originB
如果 A 是 "unsafe-none
" 并且 B 是 "unsafe-none
",则返回 true。
如果 A 是 "unsafe-none
" 或 B 是 "unsafe-none
",则返回 false。
如果 A 等于 B 并且 originA 与 originB 是 同源,则返回 true。
返回 false。
头字段/Cross-Origin-Opener-Policy
所有当前引擎中均支持。
一个 文档
的 跨源打开者策略 来自 `Cross-Origin-Opener-Policy
` 和 `Cross-Origin-Opener-Policy-Report-Only
` HTTP 响应头。这些头字段是 结构化头字段,其值必须是一个 标记。 [STRUCTURED-FIELDS]
有效的 标记 值是 打开者策略值。标记还可能附带 参数;其中,"report-to
" 参数可以具有一个 有效的 URL 字符串,用于标识适当的报告端点。 [REPORTING]
根据下面描述的处理模型,如果头字段包含无效值,用户代理将忽略此头字段。同样,如果值无法解析为 标记,用户代理将忽略此头字段。
要 获取打开者策略,给定一个 响应 response 和一个 环境 reservedEnvironment
让 policy 是一个新的 打开者策略。
如果 reservedEnvironment 是一个 非安全上下文,则返回 policy。
令 parsedItem 为 获取结构化字段值 的结果,其中给出的是 `Cross-Origin-Opener-Policy
` 和 “item
” 从 response 的 头列表 中。
如果 parsedItem 不为 null,则
如果 parsedItem[0] 为 “same-origin
”,则
令 coep 为 获取跨域嵌入者策略 的结果,其中给出的是 response 和 reservedEnvironment。
如果 coep 的 值 与 跨域隔离兼容,则将 policy 的 值 设置为 “same-origin-plus-COEP
”。
否则,将 policy 的 值 设置为 “same-origin
”。
如果 parsedItem[0] 为 “same-origin-allow-popups
”,则将 policy 的 值 设置为 “same-origin-allow-popups
”。
如果 parsedItem[1]["report-to
"] 存在 并且是一个字符串,则将 policy 的 报告端点 设置为 parsedItem[1]["report-to
"]。
将 parsedItem 设置为 获取结构化字段值 的结果,其中给出的是 `Cross-Origin-Opener-Policy-Report-Only
` 和 “item
” 从 response 的 头列表 中。
如果 parsedItem 不为 null,则
如果 parsedItem[0] 为 “same-origin
”,则
令 coep 为 获取跨域嵌入者策略 的结果,其中给出的是 response 和 reservedEnvironment。
如果 coep 的 值 与 跨域隔离兼容 或 coep 的 仅报告值 与 跨域隔离兼容,则将 policy 的 仅报告值 设置为 “same-origin-plus-COEP
”。
仅报告 COOP 还考虑仅报告 COEP 以分配特殊的 “same-origin-plus-COEP
” 值。这允许开发人员在部署 COOP 和 COEP 的顺序方面拥有更大的自由度。
否则,将 policy 的 仅报告值 设置为 “same-origin
”。
如果 parsedItem[0] 为 “same-origin-allow-popups
”,则将 policy 的 仅报告值 设置为 “same-origin-allow-popups
”。
如果 parsedItem[1]["report-to
"] 存在 并且是一个字符串,则将 policy 的 仅报告报告端点 设置为 parsedItem[1]["report-to
"]。
返回 policy。
为了 检查 COOP 值是否需要浏览上下文组切换,给定布尔值 isInitialAboutBlank,两个 来源 responseOrigin 和 activeDocumentNavigationOrigin,以及两个 打开程序策略值 responseCOOPValue 和 activeDocumentCOOPValue
如果 匹配 activeDocumentCOOPValue、activeDocumentNavigationOrigin、responseCOOPValue 和 responseOrigin 的结果为 true,则返回 false。
如果以下所有条件都为真
isInitialAboutBlank;
activeDocumentCOOPValue 的 值 为 “same-origin-allow-popups
”;并且
responseCOOPValue 为 “unsafe-none
”,
则返回 false。
返回 true。
为了 检查强制执行仅报告 COOP 是否需要浏览上下文组切换,给定布尔值 isInitialAboutBlank,两个 来源 responseOrigin、activeDocumentNavigationOrigin,以及两个 打开程序策略 responseCOOP 和 activeDocumentCOOP
如果 检查 COOP 值是否需要浏览上下文组切换 的结果为 false,其中给出的是 isInitialAboutBlank、responseOrigin、activeDocumentNavigationOrigin、responseCOOP 的 仅报告值 和 activeDocumentCOOPReportOnly 的 仅报告值,则返回 false。
匹配仅报告策略允许网站在其所有页面上指定相同的仅报告打开程序策略,并且不会因这些页面之间的导航而收到违规报告。
如果 检查 COOP 值是否需要浏览上下文组切换 的结果为 true,其中给出的是 isInitialAboutBlank、responseOrigin、activeDocumentNavigationOrigin、responseCOOP 的 值 和 activeDocumentCOOPReportOnly 的 仅报告值,则返回 true。
如果 检查 COOP 值是否需要浏览上下文组切换 的结果为 true,其中给出的是 isInitialAboutBlank、responseOrigin、activeDocumentNavigationOrigin、responseCOOP 的 仅报告值 和 activeDocumentCOOPReportOnly 的 值,则返回 true。
返回 false。
布尔值 需要浏览上下文组切换,初始值为 false。
布尔值 由于仅报告而需要浏览上下文组切换,初始值为 false。
一个 URL url。
一个 来源 来源。
一个 打开程序策略 打开程序策略。
布尔值 当前上下文是导航源,初始值为 false。
为了 强制执行响应的打开程序策略,给定一个 浏览上下文 browsingContext,一个 URL responseURL,一个 来源 responseOrigin,一个 打开程序策略 responseCOOP,一个 打开程序策略执行结果 currentCOOPEnforcementResult,以及一个 来源 referrer
令 newCOOPEnforcementResult 为一个新的具有以下内容的 打开程序策略执行结果
令 isInitialAboutBlank 为 browsingContext 的 活动文档 的 是初始 about:blank
。
如果 isInitialAboutBlank 为 true 并且 browsingContext 的 初始 URL 为 null,则将 browsingContext 的 初始 URL 设置为 responseURL。
如果 检查 COOP 值是否需要浏览上下文组切换 的结果为 true,其中给出的是 isInitialAboutBlank、currentCOOPEnforcementResult 的 打开程序策略 的 值、currentCOOPEnforcementResult 的 来源、responseCOOP 的 值 和 responseOrigin,则
将 newCOOPEnforcementResult 的 需要浏览上下文组切换 设置为 true。
如果 browsingContext 的 组 的 浏览上下文集 的 大小 大于 1,则
将违规报告排队到导航到 COOP 响应时,其中给出的是 responseCOOP、“enforce
”、responseURL、currentCOOPEnforcementResult 的 url、currentCOOPEnforcementResult 的 来源、responseOrigin 和 referrer。
当从 COOP 响应导航离开时,为浏览上下文组切换排队一个违规报告,使用 currentCOOPEnforcementResult 的 opener 策略,“enforce
”,currentCOOPEnforcementResult 的 url,responseURL,currentCOOPEnforcementResult 的 origin,responseOrigin,以及 currentCOOPEnforcementResult 的 当前上下文是导航源。
如果 检查强制 report-only COOP 是否需要浏览上下文组切换 的结果,在给定 isInitialAboutBlank、responseOrigin、currentCOOPEnforcementResult 的 origin、responseCOOP 以及 currentCOOPEnforcementResult 的 opener 策略 的情况下为真,则
将 result 的 由于 report-only 需要浏览上下文组切换 设置为真。
如果 browsingContext 的 group 的 浏览上下文集 的 大小 大于 1,则
当导航到 COOP 响应时,为浏览上下文组切换排队一个违规报告,使用 responseCOOP,“reporting
”,responseURL,currentCOOPEnforcementResult 的 url,currentCOOPEnforcementResult 的 origin,responseOrigin,以及 referrer。
当从 COOP 响应导航离开时,为浏览上下文组切换排队一个违规报告,使用 currentCOOPEnforcementResult 的 opener 策略,“reporting
”,currentCOOPEnforcementResult 的 url,responseURL,currentCOOPEnforcementResult 的 origin,responseOrigin,以及 currentCOOPEnforcementResult 的 当前上下文是导航源。
返回 newCOOPEnforcementResult。
为了 获得用于导航响应的浏览上下文,在给定 浏览上下文 browsingContext、沙盒标志集 sandboxFlags、opener 策略 navigationCOOP 以及 opener 策略强制结果 coopEnforcementResult
如果 browsingContext 不是 顶级浏览上下文,则返回 browsingContext。
如果 coopEnforcementResult 的 需要浏览上下文组切换 为假,则
如果 coopEnforcementResult 的 由于 report-only 需要浏览上下文组切换 为真,则将 browsing context 的 虚拟浏览上下文组 ID 设置为新的唯一标识符。
返回 browsingContext。
令 newBrowsingContext 为 创建新的顶级浏览上下文和文档 的第一个返回值。
在这种情况下,我们将执行浏览上下文组交换。browsingContext 将不会被我们即将要 创建 的新的 Document
使用。如果它也不被其他 Document
(例如,后向/前向缓存中的那些)使用,则用户代理可能会在此时 销毁它。
如果 navigationCOOP 的 值 为 "same-origin-plus-COEP
",则将 newBrowsingContext 的 group 的 跨源隔离模式 设置为 "logical
" 或 "concrete
"。选择哪一个是 实现定义的。
在某些平台上,很难提供 跨源隔离功能 所需的安全属性。"concrete
" 授予对它的访问权限,而 "logical
" 则不授予。
如果 sandboxFlags 不为空,则
返回 newBrowsingContext。
一个 访问者-被访问者关系 是一个枚举,它描述了两个 浏览上下文 之间的关系,这两个上下文之间发生了访问。它可以采用以下值
为了 检查两个浏览上下文之间的访问是否应该被报告,在给定两个 浏览上下文 accessor 和 accessed、一个 JavaScript 属性名称 P 以及一个 环境设置对象 environment
如果 P 不是 跨源可访问的窗口属性名称,则返回。
令 accessorInclusiveAncestorOrigins 为通过获取 accessor 的 活动文档 的 包含祖先可导航元素 中每个元素的 origin 获得的列表。
令 accessedInclusiveAncestorOrigins 为通过获取 accessed 的 活动文档 的 包含祖先可导航元素 中每个元素的 origin 获得的列表。
如果 accessorInclusiveAncestorOrigins 中的任何元素与 accessorTopDocument 的 origin 同源,或者如果 accessedInclusiveAncestorOrigins 中的任何元素与 accessedTopDocument 的 origin 同源,则返回。
这避免了将跨源 iframe 的信息泄露给具有 opener 策略报告的顶级框架。
如果 accessor 的 顶级浏览上下文 的 虚拟浏览上下文组 ID 是 accessed 的 顶级浏览上下文 的 虚拟浏览上下文组 ID,则返回。
令 accessorAccessedRelationship 为一个新的 访问者-被访问者关系,其值为 无。
如果 accessed 的 顶级浏览上下文 的 打开者浏览上下文 是 accessor 或 accessor 的 祖先,则将 accessorAccessedRelationship 设置为 访问者是打开者。
如果 accessor 的 顶级浏览上下文 的 打开者浏览上下文 是 accessed 或 accessed 的 祖先,则将 accessorAccessedRelationship 设置为 访问者是被打开者。
根据 accessorAccessedRelationship、accessorTopDocument 的 打开者策略、accessedTopDocument 的 打开者策略、accessor 的 活动文档 的 URL、accessed 的 活动文档 的 URL、accessor 的 顶级浏览上下文 的 初始 URL、accessed 的 顶级浏览上下文 的 初始 URL、accessor 的 活动文档 的 源、accessed 的 活动文档 的 源、accessor 的 顶级浏览上下文 的 创建时的打开者源、accessed 的 顶级浏览上下文 的 创建时的打开者源、accessorTopDocument 的 referrer、accessedTopDocument 的 referrer、P 和 environment,将访问的违规报告加入队列。
给定一个 URL url,将 URL 清理以发送到报告中。
给定一个 打开者策略 coop、字符串 disposition、URL coopURL、URL previousResponseURL、两个 源 coopOrigin 和 previousResponseOrigin 以及一个 referrer referrer,将导航到 COOP 响应时浏览上下文组切换的违规报告加入队列。
如果 coop 的 报告端点 为 null,则返回。
将 coopValue 设置为 coop 的 值。
如果 disposition 为 "reporting
",则将 coopValue 设置为 coop 的 仅报告值。
将 serializedReferrer 设置为空字符串。
如果 referrer 是一个 URL,则将 serializedReferrer 设置为 referrer 的 序列化。
将 body 设置为一个包含以下属性的新对象。
key | value |
---|---|
disposition | disposition |
effectivePolicy | coopValue |
previousResponseURL | 如果 coopOrigin 和 previousResponseOrigin 同源,则这是 previousResponseURL 的 清理,否则为 null。 |
referrer | serializedReferrer |
type | "navigation-to-response " |
将 body 作为 "coop
" 加入队列,用于 coop 的 报告端点,并附带 coopURL。
给定一个 打开者策略 coop、字符串 disposition、URL coopURL、URL nextResponseURL、两个 源 coopOrigin 和 nextResponseOrigin 以及一个布尔值 isCOOPResponseNavigationSource,将从 COOP 响应导航时浏览上下文组切换的违规报告加入队列。
如果 coop 的 报告端点 为 null,则返回。
将 coopValue 设置为 coop 的 值。
如果 disposition 为 "reporting
",则将 coopValue 设置为 coop 的 仅报告值。
将 body 设置为一个包含以下属性的新对象。
key | value |
---|---|
disposition | disposition |
effectivePolicy | coopValue |
nextResponseURL | 如果 coopOrigin 和 nextResponseOrigin 同源 或 isCOOPResponseNavigationSource 为 true,则这是 previousResponseURL 的 清理,否则为 null。 |
type | "navigation-from-response " |
将 body 作为 "coop
" 加入队列,用于 coop 的 报告端点,并附带 coopURL。
给定一个 访问者-被访问者关系 accessorAccessedRelationship、两个 打开者策略 accessorCOOP 和 accessedCOOP、四个 URL accessorURL、accessedURL、accessorInitialURL、accessedInitialURL、四个 源 accessorOrigin、accessedOrigin、accessorCreatorOrigin 和 accessedCreatorOrigin、两个 referrer accessorReferrer 和 accessedReferrer、字符串 propertyName 以及 环境设置对象 environment,将访问的违规报告加入队列。
如果 coop 的 报告端点 为 null,则返回。
将 coopValue 设置为 coop 的 值。
如果 disposition 为 "reporting
",则将 coopValue 设置为 coop 的 仅报告值。
如果 accessorAccessedRelationship 为 访问者是打开者
根据 accessorCOOP、accessorURL、accessedURL、accessedInitialURL、accessorOrigin、accessedOrigin、accessedCreatorOrigin、propertyName 和 environment,将访问打开窗口的违规报告加入队列。
根据 accessedCOOP、accessedURL、accessorURL、accessedOrigin、accessorOrigin、propertyName 和 accessedReferrer,将从打开者访问的违规报告加入队列。
否则,如果 accessorAccessedRelationship 为 访问者是被打开者
根据 accessorCOOP、accessorURL、accessedURL、accessorOrigin、accessedOrigin、propertyName、accessorReferrer 和 environment,将访问打开者的违规报告加入队列。
根据 accessedCOOP、accessedURL、accessorURL、accessorInitialURL、accessedOrigin、accessorOrigin、accessorCreatorOrigin 和 propertyName,将从打开窗口访问的违规报告加入队列。
否则
根据 accessorCOOP、accessorURL、accessedURL、accessorOrigin、accessedOrigin、propertyName 和 environment,将访问其他窗口的违规报告加入队列。
根据 accessedCOOP、accessedURL、accessorURL、accessedOrigin、accessorOrigin 和 propertyName,将从其他窗口访问的违规报告加入队列。
给定一个 打开者策略 coop、两个 URL coopURL 和 openerURL、两个 源 coopOrigin 和 openerOrigin、字符串 propertyName、一个 referrer referrer 以及一个 环境设置对象 environment,将访问打开者的违规报告加入队列。
将 sourceFile、lineNumber 和 columnNumber 设置为触发该报告的相关脚本 URL 和问题位置。
将 serializedReferrer 设置为空字符串。
如果 referrer 是一个 URL,则将 serializedReferrer 设置为 referrer 的 序列化。
将 body 设置为一个包含以下属性的新对象。
key | value |
---|---|
disposition | "reporting " |
effectivePolicy | coop 的 仅报告值 |
property | propertyName |
openerURL | 如果 coopOrigin 和 openerOrigin 同源,则这是 openerURL 的 清理,否则为 null。 |
referrer | serializedReferrer |
sourceFile | sourceFile |
lineNumber | lineNumber |
columnNumber | columnNumber |
type | "access-to-opener " |
将 body 作为 "coop
" 加入队列,用于 coop 的 报告端点,并附带 coopURL 和 environment。
要 为访问打开的窗口排队违规报告,给定一个 打开者策略 coop,三个 URL coopURL、openedWindowURL 和 initialWindowURL,三个 来源 coopOrigin、openedWindowOrigin 和 openerInitialOrigin,一个字符串 propertyName 和一个 环境设置对象 environment
将 sourceFile、lineNumber 和 columnNumber 设置为触发该报告的相关脚本 URL 和问题位置。
将 body 设置为一个包含以下属性的新对象。
key | value |
---|---|
disposition | "reporting " |
effectivePolicy | coop 的 仅报告值 |
property | propertyName |
openedWindowURL | 如果 coopOrigin 和 openedWindowOrigin 是 相同来源,则这是 openedWindowURL 的 清理,否则为 null。 |
openedWindowInitialURL | 如果 coopOrigin 和 openerInitialOrigin 是 相同来源,则这是 initialWindowURL 的 清理,否则为 null。 |
sourceFile | sourceFile |
lineNumber | lineNumber |
columnNumber | columnNumber |
type | "access-to-opener " |
要 为访问另一个窗口排队违规报告,给定一个 打开者策略 coop,两个 URL coopURL 和 otherURL,两个 来源 coopOrigin 和 otherOrigin,一个字符串 propertyName 和一个 环境设置对象 environment
将 sourceFile、lineNumber 和 columnNumber 设置为触发该报告的相关脚本 URL 和问题位置。
将 body 设置为一个包含以下属性的新对象。
key | value |
---|---|
disposition | "reporting " |
effectivePolicy | coop 的 仅报告值 |
property | propertyName |
otherURL | 如果 coopOrigin 和 otherOrigin 是 相同来源,则这是 otherURL 的 清理,否则为 null。 |
sourceFile | sourceFile |
lineNumber | lineNumber |
columnNumber | columnNumber |
type | "access-to-opener " |
要 为来自打开者的访问排队违规报告,给定一个 打开者策略 coop,两个 URL coopURL 和 openerURL,两个 来源 coopOrigin 和 openerOrigin,一个字符串 propertyName 和一个 推荐者 referrer
如果 coop 的 报告端点 为 null,则返回。
将 serializedReferrer 设置为空字符串。
如果 referrer 是一个 URL,则将 serializedReferrer 设置为 referrer 的 序列化。
将 body 设置为一个包含以下属性的新对象。
key | value |
---|---|
disposition | "reporting " |
effectivePolicy | coop 的 仅报告值 |
property | propertyName |
openerURL | 如果 coopOrigin 和 openerOrigin 是 相同来源,则这是 openerURL 的 清理,否则为 null。 |
referrer | serializedReferrer |
type | "access-to-opener " |
要 为来自打开的窗口的访问排队违规报告,给定一个 打开者策略 coop,三个 URL coopURL、openedWindowURL 和 initialWindowURL,三个 来源 coopOrigin、openedWindowOrigin 和 openerInitialOrigin,以及一个字符串 propertyName
如果 coop 的 报告端点 为 null,则返回。
将 body 设置为一个包含以下属性的新对象。
key | value |
---|---|
disposition | "reporting " |
effectivePolicy | coopValue |
property | coop 的 仅报告值 |
openedWindowURL | 如果 coopOrigin 和 openedWindowOrigin 是 相同来源,则这是 openedWindowURL 的 清理,否则为 null。 |
openedWindowInitialURL | 如果 coopOrigin 和 openerInitialOrigin 是 相同来源,则这是 initialWindowURL 的 清理,否则为 null。 |
type | "access-to-opener " |
要 为来自另一个窗口的访问排队违规报告,给定一个 打开者策略 coop,两个 URL coopURL 和 otherURL,两个 来源 coopOrigin 和 otherOrigin,以及一个字符串 propertyName
如果 coop 的 报告端点 为 null,则返回。
将 body 设置为一个包含以下属性的新对象。
key | value |
---|---|
disposition | "reporting " |
effectivePolicy | coop 的 仅报告值 |
property | propertyName |
otherURL | 如果 coopOrigin 和 otherOrigin 是 相同来源,则这是 otherURL 的 清理,否则为 null。 |
type | access-to-opener |
所有当前引擎中均支持。
一个 嵌入器策略值 是三个字符串之一,它控制在没有资源所有者明确许可的情况下获取跨源资源。
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
" 或 "require-corp
",则 与跨源隔离兼容。
一个 嵌入器策略 由以下部分组成:
一个 值,它是一个 嵌入器策略值,最初是 "unsafe-none
"。
一个 报告端点 字符串,最初为空字符串。
一个 仅报告值,它是一个 嵌入器策略值,最初是 "unsafe-none
"。
一个 仅报告报告端点 字符串,最初为空字符串。
"coep
" 报告类型 是一个 报告类型,其值为 "coep
"。它 对 ReportingObserver
可见。
`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
令 policy 为一个新的 嵌入器策略。
如果 environment 是一个 非安全上下文,则返回 policy。
令 parsedItem 为使用 Cross-Origin-Embedder-Policy
和 "item
" 从 response 的 头部列表 中 获取结构化字段值 的结果。
如果 parsedItem 不为空且 parsedItem[0] 与跨域隔离兼容
令 parsedItem 为使用 Cross-Origin-Embedder-Policy-Report-Only
和 "item
" 从 response 的 头部列表 中 获取结构化字段值 的结果。
如果 parsedItem 不为空且 parsedItem[0] 与跨域隔离兼容
返回 policy。
要 检查导航响应是否符合其嵌入器策略,需要提供一个 响应 response,一个 可导航对象 navigable 和一个 嵌入器策略 responsePolicy
如果 navigable 不是一个 子可导航对象,则返回 true。
如果 parentPolicy 的 仅报告值 与跨域隔离兼容 且 responsePolicy 的 值 不兼容,则 将跨域嵌入器策略继承违规事件加入队列,并传入 response、"navigation
"、parentPolicy 的 仅报告端点、"reporting
" 和 navigable 的 容器文档 的 相关设置对象。
如果 parentPolicy 的 值 与跨域隔离不兼容 或 responsePolicy 的 值 与跨域隔离兼容,则返回 true。
将跨域嵌入器策略继承违规事件加入队列,并传入 response、"navigation
"、parentPolicy 的 端点、"enforce
" 和 navigable 的 容器文档 的 相关设置对象。
返回 false。
要 检查全局对象的嵌入器策略,需要提供一个 WorkerGlobalScope
workerGlobalScope,一个 环境设置对象 owner 和一个 响应 response
如果 workerGlobalScope 不是一个 DedicatedWorkerGlobalScope
对象,则返回 true。
令 policy 为 workerGlobalScope 的 嵌入器策略。
如果 ownerPolicy 的 仅报告值 与跨域隔离兼容 且 policy 的 值 不兼容,则 将跨域嵌入器策略继承违规事件加入队列,并传入 response、"worker initialization
"、ownerPolicy 的 仅报告端点、"reporting
" 和 owner。
将跨域嵌入器策略继承违规事件加入队列,并传入 response、"worker initialization
"、ownerPolicy 的 端点、"enforce
" 和 owner。
返回 false。
要 将跨域嵌入器策略继承违规事件加入队列,需要提供一个 响应 response,一个字符串 type,一个字符串 endpoint,一个字符串 disposition 和一个 环境设置对象 settings
令 serialized 为使用 response 将响应 URL 序列化以用于报告 的结果。
将 body 设置为一个包含以下属性的新对象。
key | value |
---|---|
type | type |
blockedURL | serialized |
disposition | disposition |
将 body 作为 "coep
" 报告类型 添加到 endpoint 的 settings 上的队列中。
一个 沙箱标志集 是由零个或多个以下标志组成,用于限制潜在不可信资源的能力
此标志 阻止内容导航到沙箱浏览上下文以外的浏览上下文(或嵌套在其中的浏览上下文)、辅助浏览上下文(由下一个定义的 沙箱辅助导航浏览上下文标志 保护)和 顶级浏览上下文(由下面定义的 沙箱顶级无用户激活导航浏览上下文标志 和 沙箱顶级有用户激活导航浏览上下文标志 保护)。
如果 沙箱辅助导航浏览上下文标志 未设置,则在某些情况下,限制仍然允许打开弹出窗口(新的 顶级浏览上下文)。这些 浏览上下文 始终具有 一个允许的沙箱导航器,在创建浏览上下文时设置,允许创建它们的 浏览上下文 实际导航它们。(否则,沙箱导航浏览上下文标志 将阻止它们被导航,即使它们被打开了。)
此标志 阻止内容创建新的辅助浏览上下文,例如使用 target
属性或 window.open()
方法。
此标志 阻止内容在他们的 顶级浏览上下文 中进行导航,并且 阻止内容关闭他们的 顶级浏览上下文。它仅在沙箱浏览上下文的 活动窗口 没有 瞬时激活 时才被查询。
当 沙箱顶级导航无用户激活浏览上下文标志 未 设置时,内容可以在其 顶级浏览上下文 中导航,但其他 浏览上下文 仍然受 沙箱导航浏览上下文标志 和可能存在的 沙箱辅助导航浏览上下文标志 的保护。
此标志 阻止内容在他们的 顶级浏览上下文 中进行导航,并且 阻止内容关闭他们的 顶级浏览上下文。它仅在沙箱浏览上下文的 活动窗口 有 瞬时激活 时才被查询。
与 沙箱顶级导航无用户激活浏览上下文标志 一样,此标志仅影响 顶级浏览上下文;如果未设置它,其他 浏览上下文 可能仍受其他标志的保护。
此标志 将内容强制为不透明来源,从而阻止它访问来自同一 来源 的其他内容。
此标志还 阻止脚本读取或写入 document.cookie
IDL 属性,并阻止访问 localStorage
。
此标志 阻止表单提交。
此标志禁用指针锁定 API。 [POINTERLOCK]
此标志 阻止脚本执行。
document.domain
浏览上下文标志此标志阻止内容使用 document.domain
设置器。
此标志阻止内容使用以下任何功能来生成模态对话框
此标志禁用锁定屏幕方向的功能。 [SCREENORIENTATION]
此标志禁用演示 API。 [PRESENTATION]
当用户代理要 解析沙箱指令 时,给定一个字符串 input,一个 沙箱标志集 output,它必须运行以下步骤
按 ASCII 空格拆分 input,以获得 tokens。
设 output 为空。
将以下标志添加到 output
沙箱辅助导航浏览上下文标志,除非 tokens 包含 allow-popups
关键字。
沙箱顶级导航无用户激活浏览上下文标志,除非 tokens 包含 allow-top-navigation
关键字。
沙箱顶级导航有用户激活浏览上下文标志,除非 tokens 包含 allow-top-navigation-by-user-activation
关键字或 allow-top-navigation
关键字。
这意味着,如果存在 allow-top-navigation
,则 allow-top-navigation-by-user-activation
关键字将不起作用。因此,同时指定两者是一个文档一致性错误。
沙箱来源浏览上下文标志,除非 tokens 包含 allow-same-origin
关键字。
allow-same-origin
关键字适用于两种情况。
首先,它可以用于允许来自同一站点的内容被沙箱以禁用脚本,同时仍允许访问沙箱内容的 DOM。
其次,它可以用于嵌入来自第三方站点的內容,沙箱以阻止该站点打开弹出窗口等,而不会阻止嵌入页面使用数据库 API 存储数据等与其实源站点进行通信。
沙箱表单浏览上下文标志,除非 tokens 包含 allow-forms
关键字。
沙箱指针锁定浏览上下文标志,除非 tokens 包含 allow-pointer-lock
关键字。
沙箱脚本浏览上下文标志,除非 tokens 包含 allow-scripts
关键字。
沙箱自动功能浏览上下文标志,除非 tokens 包含 allow-scripts
关键字(如上所述)。
此标志被与脚本相同的关键字放宽,因为当脚本启用时,这些功能很可能已经可以实现,强制作者在沙箱中使用脚本而不是允许他们使用声明性功能来实现它们会很可惜。
沙箱传播到辅助浏览上下文标志,除非 tokens 包含 allow-popups-to-escape-sandbox
关键字。
沙箱模态标志,除非 tokens 包含 allow-modals
关键字。
沙箱方向锁定浏览上下文标志,除非 tokens 包含 allow-orientation-lock
关键字。
沙箱演示浏览上下文标志,除非 tokens 包含 allow-presentation
关键字。
沙箱下载浏览上下文标志,除非 tokens 包含 allow-downloads
关键字。
沙箱自定义协议导航浏览上下文标志,除非 tokens 包含 allow-top-navigation-to-custom-protocols
关键字、allow-popups
关键字或 allow-top-navigation
关键字。
每个 顶级浏览上下文 都有一个 弹出式沙箱标志集,它是一个 沙箱标志集。当一个 浏览上下文 被创建时,它的 弹出式沙箱标志集 必须为空。它由 选择可导航的规则 和 获取用于导航响应的浏览上下文 算法填充。
每个 iframe
元素都有一个 iframe
沙箱标志集,它是一个 沙箱标志集。在任何特定时间设置的 iframe
沙箱标志集 中的标志由 iframe
元素的 sandbox
属性决定。
每个 Document
都有一个 活动沙箱标志集,它是一个 沙箱标志集。当 Document
被创建时,它的 活动沙箱标志集 必须为空。它由 导航算法 填充。
每个 CSP 列表 cspList 都有 CSP 派生的沙箱标志,它是一个 沙箱标志集。它是以下算法的返回值
令 directives 为一个空的 有序集。
对于 cspList 中的每个策略
如果 directives 为空,则返回一个空的 沙箱标志集。
令 directive 为 directives[directives 的 大小 − 1]。
返回 解析沙箱指令 directive 的结果。
要 确定浏览上下文的创建沙箱标志 browsing context,给定 null 或元素 embedder,返回以下 沙箱标志集 中存在的标志的 并集
如果 embedder 为 null,则:browsing context 的 弹出式沙箱标志集 上设置的标志。
如果 embedder 是一个元素,则:embedder 的 iframe
沙箱标志集 上设置的标志。
一个 策略容器 是一个 结构体,包含应用于 Document
、WorkerGlobalScope
或 WorkletGlobalScope
的策略。它有以下 项
将其他策略移入策略容器。
要 克隆一个策略容器,给定一个 策略容器 policyContainer
要确定一个 URL url 是否需要将策略容器存储在历史记录中
要 从获取响应创建策略容器,给定一个 响应 response 和一个 环境-或-null environment
如果 response 的 URL 的 方案 是 "blob
",则返回 response 的 URL 的 blob URL 条目 的 环境 的 策略容器 的 克隆。
令 result 为一个新的 策略容器。
将 result 的 CSP 列表 设置为 解析响应的 Content Security Policies 的结果,给定 response。
如果 environment 非空,则将 result 的 嵌入器策略 设置为 获取嵌入器策略 的结果,给定 response 和 environment。否则,将其设置为 "unsafe-none
"。
将 result 的 推荐者策略 设置为 解析 `Referrer-Policy
` 头部 的结果,给定 response。 [REFERRERPOLICY]
返回 result。
要 确定导航参数策略容器,给定一个 URL responseURL 和四个 策略容器-或-null historyPolicyContainer、initiatorPolicyContainer、parentPolicyContainer 和 responsePolicyContainer
如果 historyPolicyContainer 非空,则
断言:responseURL 需要将策略容器存储在历史记录中。
返回 historyPolicyContainer 的 克隆。
如果 responseURL 是 about:srcdoc
,则
如果 responseURL 是本地的 并且 initiatorPolicyContainer 非空,则返回 initiatorPolicyContainer 的 克隆。
如果 responsePolicyContainer 非空,则返回 responsePolicyContainer。
返回一个新的 策略容器。
要 初始化工作者全局作用域的策略容器,给定一个 WorkerGlobalScope
workerGlobalScope、一个 响应 response 和一个 环境 environment