是否有可能陷入CORS错误?

mon*_*sur 57 javascript html5 cors

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

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

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

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

And*_*son 30

看到:

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

该信息是有意过滤的.

几个月后编辑:这里的后续评论询问"为什么"; 第一个链接中的锚点缺少一些字符,这使我很难看到我所指的文档的哪一部分.

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

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

该段落包括"简单响应标题"的链接,其中列出了Cache-Control,Content-Language,Content-Type,Expires,Last-Modified和Pragma.那些通过了."Access-Control-Expose-Headers标头"部分允许远程服务器通过在其中列出其他标头来公开其他标头.有关更多信息,请参阅W3C文档.

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

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

这可能会使调试变得困难,但这是一种安全性与可用性的权衡,因为"用户"在这种情况下是开发人员,所以安全性具有重要意义.

  • 如果有人解释了为什么会出现这种情况,那么这个答案可能会更好一些 - 即为什么有意过滤4xx响应的正文.快速浏览链接的文章并没有帮助. (6认同)
  • 如果我们不能抓住它们,我们如何检测它们? (5认同)
  • 以编程方式,您无法检测到它们。作为调试工程师,您必须查看浏览器的控制台。这是故意的。请参阅上面的@contrebis 回复和另一个 StackOverflow 问题的链接,向下滚动 & 比这里有更多关于“为什么”的信息。如果您控制有问题的目标服务器,您可以更改其服务器端实现,以在 HTTP 标头中提供某种故障性质的指示,但从安全角度来看,这将是不明智的。 (2认同)