JQuery和其他框架添加以下标头:
X-Requested-With:XMLHttpRequest
为什么需要这个?为什么服务器要以不同于正常请求的方式处理AJAX请求?
UPDATE :我刚刚找到了一个使用此 Headers 的真实示例:https://core.spreedly.com/manual/payment-methods/adding-with-js . 如果在没有AJAX的情况下请求支付处理器,它会在完成后重定向回原始网站 . 当使用AJAX请求时,不会进行重定向 .
JQuery和其他框架添加以下标头:
X-Requested-With:XMLHttpRequest
为什么需要这个?为什么服务器要以不同于正常请求的方式处理AJAX请求?
UPDATE :我刚刚找到了一个使用此 Headers 的真实示例:https://core.spreedly.com/manual/payment-methods/adding-with-js . 如果在没有AJAX的情况下请求支付处理器,它会在完成后重定向回原始网站 . 当使用AJAX请求时,不会进行重定向 .
3 回答
安全性的一个很好的理由 - 这可以防止CSRF攻击,因为未经服务器同意通过CORS,此标头无法添加到AJAX请求跨域 .
跨域只允许以下标头:
任何其他人导致在CORS支持的浏览器中发出“飞行前”请求 .
如果没有CORS,则无法将
X-Requested-With
添加到跨域XHR请求 .如果服务器正在检查此标头是否存在,则它知道该请求没有尝试代表具有JavaScript的用户发出请求 . 这还会检查请求是否未从常规HTML表单发布,如果不使用令牌,则很难验证它是否为跨域 . (但是,checking the Origin header可能是支持的浏览器中的一个选项,although you will leave old browsers vulnerable . )
发现了新的Flash旁路
您可能希望combine this with a token,因为Flash在OSX can set this header if there's a redirect step上的Safari上运行 . 它似乎是it also worked on Chrome,但现在已得到补救 . More details here包括受影响的不同版本 .
OWASP Recommend combining this with an Origin and Referer check:
但是,由于已经讨论过的原因,检查Origin可能很棘手 .
更新
在CORS, CSRF and X-Requested-With here上写了一篇更深入的博客文章 .
Make sure you read SilverlightFox's answer. It highlights a more important reason.
原因主要是如果您知道请求的来源,您可能需要稍微自定义它 .
例如,假设您有一个拥有许多食谱的网站 . 并且您使用自定义jQuery框架根据他们单击的链接将配方滑动到容器中 . 链接可能是
www.example.com/recipe/apple_pie
现在通常会返回整页,页眉,页脚,食谱内容和广告 . 但如果有人正在浏览您的网站,其中一些部分已经加载 . 因此,您可以使用AJAX来获取用户选择的配方,但是为了节省时间和带宽,请不要加载页眉/页脚/广告 .
现在,您可以为
www.example.com/recipe_only/apple_pie
这样的数据编写辅助 endpoints ,但这对于其他人来说更难维护和共享 .但是更容易发现它是一个发出请求的ajax请求,然后只返回一部分数据 . 这样,用户浪费的带宽就会减少,而且网站的响应速度也会提高 .
框架只是添加 Headers ,因为有些人可能会发现跟踪哪些请求是ajax以及哪些不是ajax是有用的 . 但它完全依赖开发人员来使用这些技术 .
它实际上类似于
Accept-Language
Headers . 浏览器可以请求网站请向我显示本网站的俄语版本,而无需在URL中插入/ ru /或类似内容 .一些框架正在使用此标头来检测xhr请求,例如grails spring security使用此标头来标识xhr请求,并提供json响应或html响应作为响应 .
资料来源:http://grails-plugins.github.io/grails-spring-security-core/guide/helperClasses.html