首页 > 解决方案 > 为什么 NetworkError 在静音错误模式下抛出?

问题描述

我在whatwg规范中发现这个案例很有趣:

  1. 如果 evaluationStatus 是突然完成,则:
    1. 如果重新抛出错误为真并且脚本的静音错误为假,则:
      1. 使用设置运行脚本后进行清理。
      2. 重新抛出评估状态。[[值]]。
    2. 如果重新抛出错误为真并且脚本的静音错误为真,则:
      1. 使用设置运行脚本后进行清理。
      2. 抛出“NetworkError”DOMException。
    3. 否则,重新抛出错误为假。执行以下步骤:
      1. 报告由evaluationStatus.[[Value]] 为脚本给出的异常。
      2. 使用设置运行脚本后进行清理。
      3. 返回评估状态。

我对您如何理解感兴趣:Throw a "NetworkError" DOMException.实际上,如果我们将所有错误都静音,谁知道为什么会在这里引发错误,以及为什么会引发这个错误?她出现在这里的原因是什么?

标签: javascriptecmascript-6

解决方案


TLDR:这是同源策略 (SOP) 安全限制。

该部分中的链接将带您了解更多信息。步骤 1.2 有一个指向此处的链接,其中指出:

一个布尔值,如果为真,则表示不会为此脚本中的错误提供错误信息。这用于消除跨域脚本的错误,因为这可能会泄漏私人信息。

而且,如果您查看规范,muted errors则会为给定脚本设置标志,当它从一个被认为与加载脚本的源交叉的源加载时。

核心问题是允许<script>(and importScripts) 从任意来源加载执行代码。但是,如果您从跨域位置加载脚本,重要的是,如果加载失败,出于安全原因,您无法知道它失败的原因。同样,如果您运行fetch()以加载远程 URL,那么您对请求的响应数据的了解非常有限。

至于为什么onerror,这种行为在使用处理程序时最常遇到。MDN 文档有一个导致Firefox 错误 363897onerror注释和描述安全问题的博客文章

问题的核心是,浏览器对你是什么信息以及不允许从跨域请求中获取什么信息有严格的限制。如果您能够加载跨域 URL,然后拦截异常,您可能会获得有关正在加载的 URL 内容的信息,这是同源策略旨在防止的。那里的博客文章有更多信息。


推荐阅读