是否可以捕获 CORS 错误?

IT技术 javascript html cors
2021-01-29 20:19:08

这个问题与跨域资源共享(CORS,http://www.w3.org/TR/cors/)有关。

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

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

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

1个回答

看:

...以及 XHR 级别 2 中关于 CORS 的注释:

信息被有意过滤。

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

这是一个安全问题 - 试图避免在可能敏感的 HTTP 标头中公开信息。W3C 关于 CORS 的链接说:

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

该段落包括“简单响应头”的链接,其中列出了缓存控制、内容语言、内容类型、过期时间、上次修改和编译指示。所以这些都通过了。“Access-Control-Expose-Headers headers”部分允许远程服务器通过在其中列出其他标头来公开其他标头。有关更多信息,请参阅 W3C 文档。

记住你有一个来源——假设这是你在浏览器中加载的网页,运行了一些 JavaScript——并且脚本正在向另一个来源发出请求,这通常是不允许的,因为恶意软件可以做一些令人讨厌的事情大大地。因此,运行脚本并代表其执行 HTTP 请求的浏览器充当看门人。

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

这会使调试变得困难,但这是安全性与可用性的权衡,因为在这种情况下“用户”是开发人员,因此安全性被赋予了重要的优先级。

以编程方式,您无法检测到它们。作为调试工程师,您必须查看浏览器的控制台。这是故意的。请参阅上面的@contrebis 回复和另一个 StackOverflow 问题的链接,向下滚动 & 比这里有更多关于“为什么”的信息。如果您控制有问题的目标服务器,您可以更改其服务器端实现,以在 HTTP 标头中提供某种故障性质的指示,但从安全角度来看,这将是不明智的。
2021-03-14 20:19:08
如果有人解释了为什么会出现这种情况,这个答案可能会好一点——即为什么 4xx 响应的正文被有意过滤。快速浏览链接的文章并没有帮助。
2021-03-17 20:19:08
如果我们不能抓住它们,我们如何检测它们?
2021-03-17 20:19:08
这真的很好而且有必要吗?该脚本没有收到错误消息。从中当然可以得出结论,这是一个 CORS 设置。它可以是什么?起源?标题字段?我猜坏人都知道。只是我们其他人不知道。
2021-03-21 20:19:08
这个类似的问题有一些关于为什么你甚至没有得到错误消息的礼貌的更多信息:stackoverflow.com/questions/19325314/...
2021-03-28 20:19:08