首页 文章

X-Requested-With标头有什么意义?

提问于
浏览
157

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

X-Requested-With:XMLHttpRequest

为什么需要这个?为什么服务器要以不同于正常请求的方式处理AJAX请求?

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

3 回答

  • 5

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

    跨域只允许以下标头:

    接受Accept-Language Content-Language Last-Event-ID Content-Type

    任何其他人导致在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

    这种防御技术在跨站请求伪造的鲁棒防御部分4.3中有具体讨论 . 然而,早在2008年就已经记录了使用Flash的这种防御的绕过,并且最近在2015年由Mathias Karlsson在Vimeo中利用了CSRF漏洞 . 但是,我们认为Flash攻击无法欺骗Origin或Referer标头,因此通过检查它们,我们相信这种检查组合应该可以阻止Flash绕过CSRF攻击 . (注意:如果有人可以确认或反驳这一信念,请告诉我们,以便我们更新此文章)

    但是,由于已经讨论过的原因,检查Origin可能很棘手 .

    更新

    CORS, CSRF and X-Requested-With here上写了一篇更深入的博客文章 .

  • 17

    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 /或类似内容 .

  • 191

    一些框架正在使用此标头来检测xhr请求,例如grails spring security使用此标头来标识xhr请求,并提供json响应或html响应作为响应 .

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

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

相关问题