JQuery和其他框架添加了以下头文件:
X-Requested-With: XMLHttpRequest
为什么需要这样做?为什么服务器要将AJAX请求与普通请求区别对待?
更新:我刚刚发现了一个使用此头文件的真实示例:https://core.spreedly.com/manual/payment-methods/adding-with-js。如果在没有AJAX的情况下请求支付处理器,当完成时,它会重定向回原始网站。当使用AJAX请求它时,不会进行重定向。
JQuery和其他框架添加了以下头文件:
X-Requested-With: XMLHttpRequest
为什么需要这样做?为什么服务器要将AJAX请求与普通请求区别对待?
更新:我刚刚发现了一个使用此头文件的真实示例:https://core.spreedly.com/manual/payment-methods/adding-with-js。如果在没有AJAX的情况下请求支付处理器,当完成时,它会重定向回原始网站。当使用AJAX请求它时,不会进行重定向。
当前回答
一定要阅读SilverlightFox的答案。这凸显了一个更重要的原因。
主要原因是,如果您知道请求的来源,您可能想要对其进行一点自定义。
例如,假设你有一个网站,上面有很多食谱。您还可以使用自定义jQuery框架根据他们单击的链接将食谱滑入容器。 链接可能是www.example.com/recipe/apple_pie
现在通常会返回一个完整的页面,页眉,页脚,食谱内容和广告。但如果有人正在浏览你的网站,其中一些部分已经加载。所以你可以使用AJAX来获取用户选择的食谱,但为了节省时间和带宽,不要加载页眉/页脚/广告。
现在,您可以为数据编写一个次要端点,如www.example.com/recipe_only/apple_pie,但这很难维护和共享给其他人。
但是更容易检测的是,它是一个ajax请求发出请求,然后只返回一部分数据。这样用户浪费的带宽更少,网站的反应也更灵敏。
框架只是添加了header,因为有些人可能会发现跟踪哪些请求是ajax的,哪些不是。但是使用这种技术完全取决于开发人员。
它实际上有点类似于Accept-Language头文件。浏览器可以请求一个网站,请向我展示这个网站的俄罗斯版本,而不必在URL中插入/ru/或类似的内容。
其他回答
一个很好的理由是安全性——这可以防止CSRF攻击,因为如果没有服务器通过CORS的同意,这个头不能跨域添加到AJAX请求中。
只有以下头文件被允许跨起源:
接受 接收语言 内容语言 Last-Event-ID 内容类型
任何其他选项都会在CORS支持的浏览器中发出“预飞行”请求。
如果没有CORS,就无法将X-Requested-With添加到跨域XHR请求中。
如果服务器正在检查这个报头是否存在,它就知道该请求不是从攻击者的域发起的,该攻击者试图用JavaScript代表用户发出请求。这还可以检查请求是否来自常规HTML表单,如果不使用令牌,则很难验证它不是跨域的。(但是,在受支持的浏览器中,检查Origin头是一个选项,尽管您将使旧的浏览器容易受到攻击。)
发现新的Flash旁路
你可能希望将它与令牌结合起来,因为如果有重定向步骤,在OSX上运行的Safari上的Flash可以设置这个头。它似乎也工作在Chrome,但现在补救。更多细节,包括受影响的不同版本。
OWASP建议结合Origin和Referer检查:
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)
然而,由于已经讨论过的原因,检查Origin可能很棘手。
更新
写了一篇关于CORS, CSRF和X-Requested-With的更深入的博客文章。
一定要阅读SilverlightFox的答案。这凸显了一个更重要的原因。
主要原因是,如果您知道请求的来源,您可能想要对其进行一点自定义。
例如,假设你有一个网站,上面有很多食谱。您还可以使用自定义jQuery框架根据他们单击的链接将食谱滑入容器。 链接可能是www.example.com/recipe/apple_pie
现在通常会返回一个完整的页面,页眉,页脚,食谱内容和广告。但如果有人正在浏览你的网站,其中一些部分已经加载。所以你可以使用AJAX来获取用户选择的食谱,但为了节省时间和带宽,不要加载页眉/页脚/广告。
现在,您可以为数据编写一个次要端点,如www.example.com/recipe_only/apple_pie,但这很难维护和共享给其他人。
但是更容易检测的是,它是一个ajax请求发出请求,然后只返回一部分数据。这样用户浪费的带宽更少,网站的反应也更灵敏。
框架只是添加了header,因为有些人可能会发现跟踪哪些请求是ajax的,哪些不是。但是使用这种技术完全取决于开发人员。
它实际上有点类似于Accept-Language头文件。浏览器可以请求一个网站,请向我展示这个网站的俄罗斯版本,而不必在URL中插入/ru/或类似的内容。
一些框架使用这个报头来检测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