是否可以捕获 CORS 错误?

Posted

技术标签:

【中文标题】是否可以捕获 CORS 错误?【英文标题】:Is it possible to trap CORS errors? 【发布时间】:2011-06-18 04:41:27 【问题描述】:

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

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

XMLHttpRequest 无法加载 http://domain2.example。 Access-Control-Allow-Origin 不允许来源http://domain1.example

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

【问题讨论】:

我怀疑这是否可能,因为它是浏览器功能,超出了 javascript 的范围。除此之外,它还可能导致可用于嗅探的安全漏洞。 【参考方案1】:

见:

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 头(如果any),在将响应标头暴露给 CORS API 规范中定义的 API 之前。

该段落包含“简单响应标头”的链接,其中列出了 Cache-Control、Content-Language、Content-Type、Expires、Last-Modified 和 Pragma。所以那些都通过了。 “Access-Control-Expose-Headers 标头”部分允许远程服务器通过在其中列出其他标头来公开其他标头。有关详细信息,请参阅 W3C 文档。

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

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

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

【讨论】:

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

以上是关于是否可以捕获 CORS 错误?的主要内容,如果未能解决你的问题,请参考以下文章

节点 cors 捕获中间件回调错误

使用带有 JSONP 的 AJAX 未捕获的 SyntaxError 和 CORS 错误

如何检查或验证 URL 是不是存在 - 返回 CORS 错误?

为啥在使用 Angular http.post 而不是传统的 HTML 表单时会出现 CORS 错误?

是否可以通过 StompJS (ng2Stomp) 通过 websocket 捕获未经授权的错误?

使用 Javascript 检查是不是发生 CORS 错误