jQuery和其他框架添加以下标头:
X-Requested-With:XMLHttpRequest
为什么需要这个?为什么服务器要对AJAX请求与常规请求区别对待?
更新 :我刚刚找到了一个使用此标头的真实示例:https : //core.spreedly.com/manual/payment-methods/adding-
with-js
。如果要求付款处理器不使用AJAX,则完成后它将重定向回原始网站。如果使用AJAX请求,则不会进行重定向。
出于安全性的考虑,一个很好的理由-这可以防止CSRF攻击,因为未经服务器通过CORS的同意,无法将此标头添加到AJAX请求跨域中。
跨域仅允许以下标头:
- 接受
- 接受语言
- 内容语言
- 最后事件ID
- 内容类型
任何其他原因都会导致在CORS支持的浏览器中发出“飞行前”请求。
没有CORS,就不可能添加X-Requested-With
到跨域XHR请求。
如果服务器正在检查是否存在此标头,则它知道该请求不是来自尝试使用JavaScript代表用户提出请求的攻击者的域。这还会检查请求是否不是从常规HTML表单中发布的,如果不使用令牌,则很难确定该请求不是跨域的。(但是,尽管您将使旧的浏览器容易受到攻击,但是在支持的浏览器中可以选择检查Origin
标头)。
您可能希望将其与令牌结合使用,因为如果有重定向步骤,则
OSX上Safari上运行的Flash
可以设置此标头。看来它也可以在Chrome上使用,但现在已得到修复。这里有更多详细信息,包括受影响的不同版本。
OWASP建议将其与原始和引荐检查结合使用:
此防御技术在“跨站点请求伪造的稳健防御”的第4.3节中专门讨论。但是,Mathias
Karlsson早在2008年和2015年就记录了使用Flash绕过这种防御的漏洞,以利用Vimeo中的CSRF漏洞。但是,我们认为Flash攻击无法欺骗Origin或Referer标头,因此通过同时检查这两个标头,我们认为这种检查组合应可防止Flash绕过CSRF攻击。(注意:如果有人可以确认或反驳这种信念,请告诉我们,以便我们更新本文)
但是,由于已经讨论的原因,检查Origin可能很棘手。
在此处撰写有关CORS,CSRF和X-Requested-
With的更深入的博客文章。
问题内容: 在 **http://www.a.com/service.asmx 上创建一个Web服务,并从 **http://www.b.com 向其发送跨域ajax请求。检查 Firebug 或 Live HTTP Headers中的标题 ,或您想要的任何其他插件。 在请求标头中没有 X-Requested-With HTTP标头字段的踪迹。 但是,如果您从同一域向同一服务发送ajax请求(例如
问题内容: 我正在使用jQuery ajaxForms插件使ajax提交到我的CakePHP应用。 Cake的RequestHandler通过查看“ X-Requested- With”标头来检测ajax请求,但forms插件似乎并未对其进行设置。或jQuery在使用插件时未设置它。 我已经尝试了几件事, 在主要的onload函数中,我添加了: 在插件代码中,我在实际的ajax调用之前添加了此代码
问题内容: 我想知道是否有人尝试从jquery(或普通JS)发出的ajax请求中删除“ X-Requested-With”标头。可能吗? 第二部分:您是否知道Grease Monkey的ajax请求是否设置了此标头? 谢谢 标头看起来像这样: 问题答案: “第二部分:您是否知道Grease Monkey的ajax请求是否设置了此标头?” 不,Greasemonkey不会设置此标头(尽管您当然可以添
问题内容: 我正在使用angular 1.1.5,并且正在使用$ resource将XHR制作为REST服务,但似乎$ resource并未将标头附加为X- Requested-With和XMLHttpRequest, 是正常行为? 和我是否需要手动附加标题? 问题答案: 只需将其添加到您的应用中
问题内容: 我正在开发一个完全由ajax驱动的应用程序,其中所有请求都通过一个基本上等于一个主控制器的主控制器,该主控制器看起来像这样: 这通常足以防止跨站点请求伪造吗? 当没有随每个请求刷新整个页面时,具有旋转令牌是很不方便的。 我想我可以在每次请求时都将唯一令牌作为全局javascript变量传递和更新-但是以某种方式感到笨拙并且似乎本质上不安全。 编辑-也许像用户的UUID这样的静态令牌总比