X-Requested-With头是什么意思?

JQuery和其他框架添加下面的头文件:

X-Requested-With:XMLHttpRequest

为什么这需要? 为什么服务器想要以不同于正常请求的方式处理AJAX请求?

更新 :我刚刚find一个真实的例子使用这个头: https : //core.spreedly.com/manual/payment-methods/adding-with-js 。 如果支付处理器没有AJAX请求,则在完成后redirect到原始网站。 当通过AJAX请求时,不进行redirect。

一个很好的理由是安全性 – 这可以防止CSRF攻击,因为这个头不能通过CORS被服务器的同意添加到AJAX请求跨域。

只有以下标题才可以跨域:

  • 接受
  • 接受语言
  • 内容语言
  • 最后,事件ID
  • 内容types

任何其他人都会在CORS支持的浏览器上发出“飞行前”请求。

如果没有CORS,则无法将X-Requested-With添加到跨域XHR请求中。

如果服务器正在检查这个头是否存在,它就知道这个请求不是从攻击者的域中发起的,而是试图用JavaScript来代表用户发出请求。 这也检查请求是否不是从一个普通的HTML表单发布的,其中很难validation它没有使用标记而不跨域。 (但是,在支持的浏览器中检查Origin标题可能是一个选项, 尽pipe您将使旧浏览器易受攻击 。)

发现新的Flash旁路

您可能希望将其与令牌结合使用 ,因为在OSX上的Safari上运行的Flash 可以设置此标头,如果有redirect步骤 。 它似乎也适用于Chrome ,但现在正在修复。 这里包含更多细节,包括不同的版

OWASP推荐将这个与Origin和Referer检查结合起来 :

这种防御技术在“跨站请求伪造鲁棒防御”第4.3节中具体讨论。 然而,早在2008年就已经logging了使用Flash进行防御的情况,而Mathias Karlsson在2015年之前又一次发现了Vimeo的CSRF缺陷。 但是,我们认为Flash攻击无法欺骗Origin或Referer头文件,因此通过检查两者,我们相信这些检查组合应该防止Flash绕过CSRF攻击。 (注意:如果有人可以确认或反驳这个信念,请告诉我们,这样我们可以更新这篇文章)

但是,由于已经讨论过检查Origin的原因可能会非常棘手。

更新

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

确保你阅读SilverlightFox的答案。 它凸显了一个更重要的原因。

原因主要是,如果你知道请求的来源,你可能想要定制一点。

比如说可以说你有一个拥有很多食谱的网站。 而且你使用一个自定义的jQuery框架来根据他们点击的链接将食谱滑入容器。 链接可能是www.example.com/recipe/apple_pie

现在通常会返回整页,页眉,页脚,配方内容和广告。 但是,如果有人正在浏览您的网站,其中一些部分已经加载。 因此,您可以使用AJAX来获取用户select的配方,但为了节省时间和带宽,不要加载页眉/页脚/广告。

现在您可以为www.example.com/recipe_only/apple_pie数据编写次要端点,但难以维护并与其他人分享。

但是,仅仅检测到发出请求的ajax请求,然后只返回一部分数据就更容易了。 这样用户浪费更less的带宽,网站显得更加敏感。

框架只是添加头,因为有些人可能会发现跟踪哪些请求是ajax,哪些不是。 但是完全依靠开发者来使用这种技术。

它实际上类似于Accept-Language头。 浏览器可以请求一个网站,请告诉我一个俄罗斯版本的网站,而不必在URL中插入/ ru /或类似。

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

大多数Ajax库(从v2.1开始的Prototype,JQuery和Dojo)都包含一个X-Requested-With头,表示请求是由XMLHttpRequest创build的,而不是通过点击常规的超链接或表单提交button来触发。

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