X-Requested-With头文件的意义是什么?

JQuery和其他框架添加了以下头文件:

X-Requested-With: XMLHttpRequest

为什么需要这样做?为什么服务器要将AJAX请求与普通请求区别对待?

更新:我刚刚找到了一个使用这个头文件的真实例子:https://core.spreedly.com/manual/payment-methods/adding-with-js。如果在没有AJAX的情况下请求支付处理器,当完成时,它会重定向回原始网站。当使用AJAX请求它时,不会进行重定向。

264329 次浏览

一定要阅读SilverlightFox的答案。这凸显了一个更重要的原因。

主要原因是,如果您知道请求的来源,您可能想要对其进行一点自定义。

例如,假设你有一个网站,上面有很多食谱。您还可以使用自定义jQuery框架根据他们单击的链接将食谱滑入容器。 链接可以是www.example.com/recipe/apple_pie

现在通常会返回一个完整的页面,页眉,页脚,食谱内容和广告。但如果有人正在浏览你的网站,其中一些部分已经加载。所以你可以使用AJAX来获取用户选择的食谱,但为了节省时间和带宽,不要加载页眉/页脚/广告。

现在你可以为数据写一个次要端点,比如www.example.com/recipe_only/apple_pie,但这很难维护和分享给其他人。

但是更容易检测的是,它是一个ajax请求发出请求,然后只返回一部分数据。这样用户浪费的带宽更少,网站的反应也更灵敏。

框架只是添加了header,因为有些人可能会发现跟踪哪些请求是ajax的,哪些不是。但是使用这种技术完全取决于开发人员。

它实际上有点类似于Accept-Language头文件。浏览器可以请求一个网站,请向我展示这个网站的俄罗斯版本,而不必在URL中插入/ru/或类似的内容。

一个很好的理由是为了安全——这可以防止CSRF攻击,因为如果没有服务器通过歌珥的同意,这个头不能跨域添加到AJAX请求中。

只有以下头文件被允许跨起源:

  • 接受
  • 接收语言
  • 内容语言
  • Last-Event-ID
  • 内容类型

任何其他原因导致“飞行前”;请求在CORS支持的浏览器中发出。

如果没有CORS,就不可能将X-Requested-With添加到跨域XHR请求中。

如果服务器正在检查这个报头是否存在,它就知道该请求不是从攻击者的域发起的,该攻击者试图用JavaScript代表用户发出请求。这还可以检查请求是否来自常规HTML表单,如果不使用令牌,则很难验证它不是跨域的。(然而,检查Origin头文件在受支持的浏览器中可能是一个选项,尽管你会让旧的浏览器容易受到攻击。)

发现新的Flash旁路

你可能希望将其与令牌结合起来,因为Flash运行在Safari上OSX 如果有重定向步骤,可以设置这个头吗。它出现在它也适用于Chrome浏览器,但现在已被修复。详情请点击这里包括受影响的不同版本。

OWASP建议将此与Origin和Referer检查相结合:

这种防御技术在第4.3节中具体讨论 针对跨站点请求伪造的强大防御。然而,绕道的 这种使用Flash的防御早在2008年就被记录下来了 Mathias Karlsson在2015年利用了Vimeo中的CSRF漏洞。 但是,我们相信闪电侠的攻击不能欺骗起源或者 引用头,所以通过检查它们,我们相信这一点 检查的组合应该防止Flash绕过CSRF攻击。(注意: 如果有人能证实或反驳这一观点,请让我们知道,以便我们 可以更新这篇文章)

然而,由于已经讨论过的原因,检查Origin可能很棘手。

更新

CORS, CSRF和X-Requested-With上写了一篇更深入的博客文章。

一些框架使用这个报头来检测xhr请求,例如grails spring security使用这个报头来识别xhr请求,并给出json响应或html响应作为响应。

大多数Ajax库(Prototype、JQuery和v2.1版本的Dojo)都包含一个X-Requested-With头,指示请求是由XMLHttpRequest发出的,而不是通过单击常规的超链接或表单提交按钮触发的。

来源:http://grails-plugins.github.io/grails-spring-security-core/guide/helperClasses.html