当前位置: 首页 > 面试题库 >

是否可以捕获CORS错误?

梁楷
2023-03-14
问题内容

此问题与跨域资源共享(CORS)有关。

如果在发出CORS请求时出现错误,Chrome(以及AFAIK其他浏览器)会将错误记录到错误控制台。消息示例可能如下所示:

XMLHttpRequest无法加载http://domain2.example。原产地http://domain1.example不被访问控制允许来源允许的。

我想知道是否有办法以编程方式获取此错误消息?我尝试将xhr.send()调用包装在try/catch中,也尝试添加onerror()事件处理程序。两者均未收到错误消息。


问题答案:

看到:

  • http://www.w3.org/TR/cors/#handling-a-response-to-a-cross-origin-request

…以及XHR Level 2中有关CORS的注释:

  • http://www.w3.org/TR/XMLHttpRequest2/

该信息被有意过滤。

几个月后进行编辑:此处的后续评论要求“为什么”;第一个链接的锚点缺少几个字符,这使得我很难看清我指的是文档的哪一部分。

这是安全的事情-尝试避免在HTTP标头中公开可能敏感的信息。关于CORS的W3C链接说:

用户代理必须过滤掉所有响应标头,但那些响应标头不是简单的响应标头,或者其字段名是Access-Control-Expose-
Headers标头(如果有)之一值的ASCII区分大小写的匹配项,在将响应标头公开给CORS API规范中定义的API之前。

该段落包括“简单响应头”的链接,其中列出了缓存控制,内容语言,内容类型,过期,最后修改时间和语用。这样那些就通过了。“ Access-Control-
Expose-Headers标头”部分使远程服务器也可以通过在其中列出其他标头来公开其他标头。有关更多信息,请参见W3C文档。

请记住,您有一个来源-假设这是您加载到浏览器中的网页,并运行了一些JavaScript-
脚本正在向另一个来源发出请求,通常不允许这样做,因为恶意软件会做一些令人讨厌的事情,道路。因此,运行脚本并代表其执行HTTP请求的浏览器将充当网守。

浏览器会查看来自该“其他来源”服务器的响应,如果它似乎未参与CORS,则-所需的标头丢失或格式错误-
那么我们处于不信任的位置。我们无法确定本地运行的脚本是否善意运行,因为它似乎正在尝试联系不希望通过这种方式联系的服务器。浏览器当然不应该通过仅将其整个响应传递给脚本而不进行过滤来“泄漏”该远程服务器的任何敏感信息-
这基本上是 允许 某种形式的跨域请求。会出现信息泄露漏洞。

这可能会使调试变得困难,但是这是安全性与可用性之间的折衷,因为在这种情况下,由于“用户”是开发人员,因此安全性具有重要的优先权。



 类似资料:
  • 问题内容: 任何Throwable都可以被捕获 输出: 因此,如果在初始化块期间做不好的事情,我希望能够捕获ExceptionInInitializerError。但是,以下操作无效: 输出: 并且如果我更改代码以另外捕获ArrayIndexOutOfBoundsException 被捕获的是ArrayIndexOutOfBoundsException: 谁能告诉我为什么呢? 问题答案: 顾名思义

  • 问题内容: 我一直在阅读JLS,并且遇到了11.1.3节。我引用的异步异常是: 大多数异常是由于它们所发生的线程的操作而同步发生的,并且在程序中被指定为可能导致此类异常的某个点处发生。相反,异步异常是在程序执行的任何时候都可能发生的异常。 和 异步异常仅由于以下原因而发生: […] * Java虚拟机中的内部错误或资源限制,阻止其实现Java编程语言的语义。在这种情况下,引发的异步异常是Virtu

  • 这个问题不是关于Rollbar tho:)

  • 我有一个简单的脚本: 这样,如果promise,任何错误都可以被捕获。所有的都不在promise链中调用...

  • 问题内容: 是否可以用来捕获任意一组可选参数? 例如,以下两个都应被接受为输入: 先验的 我不知道会指定哪些可选参数,但是会相应地处理它们。 问题答案: 这是一种黑客手段,但效果很好: 检查未添加的参数并添加它们 例如: 那么结果将是

  • 问题内容: 试一试无用的东西只是看看此代码是否引发了特定的异常,这是一个好方法吗? 我想在引发异常时做点什么,否则就什么也不做。 有太多的先决条件要测试,构造函数BigDecimal()始终检查所有条件,因此这似乎是最简单的方法。 问题答案: 通常,应避免这种做法。但是,由于没有实用程序方法,所以这是要走的路。 正如Peter Tillemans在评论中指出的那样,将此代码放在称为的实用程序方法中