【问题标题】:Why is NetworkError thrown in muted error mode?为什么 NetworkError 在静音错误模式下抛出?
【发布时间】:2020-03-26 16:34:54
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript ecmascript-6


    【解决方案1】:

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

    该部分中的链接可带您了解更多信息。第 1.2 步有 a link to here 声明:

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

    如果您查看规范,当给定脚本从加载脚本的源被视为跨源的源加载时,会为给定脚本设置 muted errors 标志。

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

    至于为什么,这种行为在使用onerror 处理程序时最常遇到。 The onerror MDN docs have a note 导致 Firefox bug 363897this blog post describing the security issue

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

    【讨论】:

    • 也就是说,作为 whatwg 规范的一部分的静音错误一词专门用于 CORS。对吗?
    • 是的,没错。每个加载的脚本都会有这个布尔标志来决定如何处理来自它的错误。
    猜你喜欢
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 2014-01-15
    相关资源
    最近更新 更多