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


X-Requested-With:XMLHttpRequest


为什么需要这样做?为什么服务器要对AJAX请求与常规请求进行不同的处理?方法/用js添加。如果要求付款处理器不使用AJAX,则完成后它将重定向回原始网站。使用AJAX请求时,不会进行重定向。

评论

“ [在没有AJAX的情况下被请求时,它将重定向回原始网站。在通过AJAX进行请求时,将不会进行重定向。” ->这就是您要这样做的原因。 :)

stackoverflow.com/questions/3315914/…

#1 楼

出于安全性的考虑,一个很好的理由-这可以防止CSRF攻击,因为未经服务器通过CORS的同意,无法将此标头添加到AJAX请求跨域中。

仅允许以下标头跨域:



接受
接受语言
内容语言
最后事件ID
内容类型



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

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

如果服务器正在检查是否存在此标头,则它知道该请求不是从攻击者的域发起的,尝试使用JavaScript代表用户发出请求。这还会检查请求是否不是从常规HTML表单中发布的,如果不使用令牌,则很难确定该请求不是跨域的。 (但是,尽管可能会使旧的浏览器容易受到攻击,但在受支持的浏览器中可以选择Origin标头。)

发现了新的Flash绕过功能

您可能希望结合使用此功能使用令牌,因为如果有重定向步骤,则OSX上Safari上运行的Flash可以设置此标头。看来它也可以在Chrome上使用,但现在已修复。

OWASP建议将其与Origin和Referer检查结合使用:


在<< br跨站点请求伪造的可靠防御。但是,Mathias Karlsson早在2008年就记录了使用Flash防御的绕过记录,最近在2015年又记录了
,以利用Vimeo中的CSRF漏洞。
但是,我们相信Flash攻击无法欺骗Origin或Referer标头,因此通过同时检查它们,我们认为此检查组合应可防止Flash绕过CSRF攻击。 (注意:
如果有人可以确认或反驳这一信念,请告诉我们,以便我们
可以更新本文)


但是,由于已经讨论过的原因,检查Origin可能很棘手。 br />
更新

在此处撰写了有关CORS,CSRF和X-Requested-With的更深入的博客文章。

评论


我不明白是什么阻止攻击者建立请求并添加X-Requested-With标头?

–格雷格
2014年5月15日下午0:39

@Greg:浏览器-不允许跨域使用。

– SilverlightFox
2014年5月15日晚上10:23

哦,我没有意识到只要您在同一个域中就不需要CORS配置。当您考虑时很明显。谢谢 !

–格雷格
2014年5月15日在22:20

@ vol7ron:什么也不会阻止它们,但是它们不会在请求中包含受害者的cookie,这会使他们提出请求的对象失败。为了使CSRF成功,攻击者需要浏览器自动将Cookie附加到请求中,因此没有浏览器就不会发生CSRF攻击。

– SilverlightFox
15年3月9日在18:03

@ vol7ron:前者。 CSRF是一个令人困惑的代理问题。浏览器是一个令人困惑的代理,它被“诱骗”发送Cookie,以处理用户未提出的请求。

– SilverlightFox
2015年3月10日在9:48

#2 楼

确保您阅读了SilverlightFox的答案。它突出显示了一个更重要的原因。
原因主要是,如果您知道请求的来源,则可能需要对其进行一些自定义。

例如,假设您有一个包含许多食谱的网站。然后,您可以使用自定义的jQuery框架根据其单击的链接将配方滑动到容器中。
链接可能是www.example.com/recipe/apple_pie

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

现在,您可以为www.example.com/recipe_only/apple_pie之类的数据编写辅助端点,但是很难维护并与他人共享。

但是,仅检测到它是发出请求的ajax请求,然后仅返回部分数据,会更容易。这样,用户浪费更少的带宽,站点显得响应更快。

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

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

评论


哇,这听起来像一场可怕的维修噩梦。如果要返回同一页面的其他表示形式,则应为Accept标头提供不同的内容类型。为此使用自定义标头听起来是错误的方法。

–吉利
13年7月6日在1:52

#3 楼

一些框架正在使用此标头来检测xhr请求,例如Grails Spring Security正在使用此标头来标识xhr请求,并给出json响应或html响应作为响应。


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


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