提问者:小点点

有可能捕获CORS错误吗?


这个问题与跨原产地资源共享有关(CORS,http://www.w3.org/tr/CORS/)。

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

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

我想知道有没有一种方法可以通过编程方式获得这个错误消息? 我已经尝试在try/catch中包装我的xhr.send()调用,我还尝试添加一个onerror()事件处理程序。 两者都不会收到错误消息。


共1个答案

匿名用户

参见:

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

。。。以及XHR Level 2中关于CORS的注释:

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

信息被有意过滤。

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

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

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

这篇文章包括“简单响应头”的链接,其中列出了缓存控制,内容语言,内容类型,过期,最后修改和pragma。 这样就能通过了。 “access-control-expose-headers headers”部分允许远程服务器通过在其中列出其他头来公开它们。 有关更多信息,请参阅W3C文档。

请记住,您有一个起源--假设这是您在浏览器中加载的网页,运行一些JavaScript--而脚本正在向另一个起源发出请求,这通常是不允许的,因为恶意软件可以用这种方式做糟糕的事情。 因此,运行脚本并代表浏览器执行HTTP请求的浏览器充当了网守。

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

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