安全上下文

一个 安全上下文 是满足一定最低身份验证和机密性标准的 WindowWorker。许多网络 API 和功能只能在安全上下文中访问。安全上下文的首要目标是防止 中间人攻击者 访问可能进一步危及攻击受害者的强大 API。

为什么某些功能应该受到限制?

网络上的一些 API 非常强大,使攻击者能够执行以下操作,甚至更多

  • 侵犯用户的隐私。
  • 获得对用户计算机的低级访问权限。
  • 访问用户凭据等数据。

何时认为上下文是安全的?

当上下文满足 安全上下文 规范中定义的某些最低身份验证和机密性标准时,就被认为是安全的。当文档是 活动文档 并且属于 顶级浏览上下文(基本上是包含窗口或选项卡)且是安全上下文时,则认为该文档处于安全上下文中。

例如,即使通过 TLS 传输的文档位于 <iframe> 中,如果它的祖先也没有通过 TLS 传输,则其上下文 被认为是安全的。

但是,需要注意的是,如果非安全上下文导致创建新窗口(是否指定 noopener 都一样),那么打开程序不安全不会影响新窗口是否被认为是安全。这是因为,确定特定文档是否处于安全上下文仅基于对与之关联的顶级浏览上下文进行考虑,而不考虑是否使用了非安全上下文来创建它。

本地传送的资源(例如具有 http://127.0.0.1 URL、https://127.0.0.1http://*.localhost URL(例如 http://dev.whatever.localhost/)以及 file:// URL 的资源)也被认为是安全传送的。

注意: Firefox 84 及更高版本支持 https://127.0.0.1http://*.localhost URL 作为可信来源(早期版本不支持,因为 localhost 不保证映射到本地/环回地址)。

要被认为是安全的,非本地资源必须满足以下条件

  • 必须通过 https://wss:// URL 传送
  • 用于传送资源的网络通道的安全属性不能被视为已弃用

功能检测

页面可以使用功能检测来检查它们是否处于安全上下文中,方法是使用 Window.isSecureContextWorkerGlobalScope.isSecureContext 布尔值,该值在全局范围内公开。

js
if (window.isSecureContext) {
  // Page is a secure context so service workers are now available
  navigator.serviceWorker.register("/offline-worker.js").then(() => {
    // …
  });
}

规范

规范
安全上下文

另请参阅