关于jquery:X-Requested-With标头有什么意义?

What's the point of the X-Requested-With header?

jquery和其他框架添加了以下标题:

X-Requested-With: XMLHttpRequest

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

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


一个很好的安全原因是,这可以防止CSRF攻击,因为没有服务器通过CORS的同意,这个头不能添加到Ajax请求跨域中。

只允许跨域使用下列头:

  • Accept
  • Accept-Language
  • Content-Language
  • Last-Event-ID
  • Content-Type

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

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

如果服务器正在检查此头是否存在,则它知道请求不是从试图使用javascript代表用户发出请求的攻击者域发起的。这还检查了请求是否不是从常规的HTML表单发布的,很难在没有使用令牌的情况下验证它是否是跨域的。(不过,在受支持的浏览器中,检查Origin头可能是一个选项,尽管您会使旧浏览器容易受到攻击。)

发现新的闪存旁路

您可能希望将其与一个令牌结合起来,因为在OSX上运行Safari的flash可以在有重定向步骤的情况下设置这个头部。它似乎也对铬起作用,但现在已得到修复。这里有更多的细节,包括受影响的不同版本。

OWASP建议将此与源站和引用检查结合使用:

This defense technique is specifically discussed in section 4.3 of
Robust Defenses for Cross-Site Request Forgery. However, bypasses of
this defense using Flash were documented as early as 2008 and again as
recently as 2015 by Mathias Karlsson to exploit a CSRF flaw in Vimeo.
But, we believe that the Flash attack can't spoof the Origin or
Referer headers so by checking both of them we believe this
combination of checks should prevent Flash bypass CSRF attacks. (NOTE:
If anyone can confirm or refute this belief, please let us know so we
can update this article)

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

更新

在这里写了一篇关于CORS、CSRF和X-REQUEST-WITH的更深入的博客文章。


请务必阅读SilverlightFox的答案。它强调了一个更重要的原因。

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

例如,假设你有一个网站有许多食谱。您还可以使用一个定制的jquery框架,根据它们单击的链接,将配方滑入容器中。链接可以是www.example.com/recipe/apple_pie

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

现在,您只需为www.example.com/recipe_only/apple_pie之类的数据编写一个辅助端点,但这很难维护,也很难与其他人共享。

但更容易检测到这是一个发出请求的Ajax请求,然后只返回部分数据。这样,用户浪费的带宽更少,站点的响应速度也更快。

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

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


一些框架使用这个头来检测XHR请求,例如GrailsSpring安全性使用这个头来识别XHR请求,并给出JSON响应或HTML响应作为响应。

Most Ajax libraries (Prototype, JQuery, and Dojo as of v2.1) include an X-Requested-With header that indicates that the request was made by XMLHttpRequest instead of being triggered by clicking a regular hyperlink or form submit button.

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