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 请求时,不会进行重定向。
一个很好的理由是为了安全 - 这可以防止CSRF攻击,因为未经服务器同意,此标头无法通过CORS添加到 AJAX 跨域请求中。
跨源仅允许以下标头:
- 接受
- 接受语言
- 内容-语言
- 最后事件 ID
- 内容类型
任何其他都会导致在支持 CORS 的浏览器中发出“飞行前”请求。
如果没有 CORS,就无法添加X-Requested-With
到跨域 XHR 请求。
如果服务器正在检查此标头是否存在,则它知道该请求不是从尝试使用 JavaScript 代表用户发出请求的攻击者的域发起的。这还会检查请求是否不是从常规 HTML 表单发布的,如果不使用令牌,就很难验证它不是跨域的。(但是,在受支持的浏览器中检查Origin
标头可能是一个选项,尽管您会使旧浏览器易受攻击。)
您可能希望将此与令牌结合使用,因为如果存在重定向步骤,则在 OSX 上的 Safari 上运行的 Flash可以设置此标头。它似乎也适用于 Chrome,但现在已修复。此处提供更多详细信息,包括受影响的不同版本。
OWASP 建议将此与 Origin 和 Referer 检查结合起来:
这种防御技术在跨站点请求伪造的稳健防御第 4.3 节中进行了具体讨论。然而,早在 2008 年和最近的 2015 年,Mathias Karlsson 就利用 Vimeo 中的 CSRF 漏洞记录了使用 Flash 绕过这种防御的记录。但是,我们认为 Flash 攻击不能欺骗 Origin 或 Referer 标头,因此通过检查这两个标头,我们相信这种检查组合应该可以防止 Flash 绕过 CSRF 攻击。(注意:如果有人可以证实或反驳这一信念,请告诉我们,以便我们更新本文)
但是,由于已经讨论过的原因,检查 Origin 可能会很棘手。
在此处撰写有关CORS、CSRF 和 X-Requested-With的更深入的博客文章。
确保您阅读 SilverlightFox 的答案。它突出了一个更重要的原因。
原因主要是如果您知道请求的来源,您可能想要稍微自定义它。
例如,假设您有一个包含许多食谱的网站。您使用自定义 jQuery 框架根据他们单击的链接将食谱滑入容器中。链接可能是www.example.com/recipe/apple_pie
现在通常返回一个完整的页面、页眉、页脚、食谱内容和广告。但是,如果有人正在浏览您的网站,其中一些部分已经加载。因此,您可以使用 AJAX 来获取用户选择的配方,但为了节省时间和带宽,请不要加载页眉/页脚/广告。
现在您可以只为数据编写一个辅助端点,www.example.com/recipe_only/apple_pie
但是这更难维护和分享给其他人。
但是更容易检测到它是一个发出请求然后只返回一部分数据的ajax请求。这样,用户浪费的带宽更少,网站的响应速度更快。
框架只是添加标头,因为有些人可能会发现跟踪哪些请求是 ajax 以及哪些不是很有用。但使用这些技术完全取决于开发人员。
它实际上有点类似于Accept-Language
标题。浏览器可以请求网站,请向我显示该网站的俄语版本,而无需在 URL 中插入 /ru/ 或类似内容。
Some frameworks are using this header to detect xhr requests e.g. grails spring security is using this header to identify xhr request and give either a json response or html response as response.
Most Ajax libraries (Prototype, JQuery, and Dojo as of v2.1) include an X-Requested-With header that indicates that the request was made by XMLHttpRequest instead of being triggered by clicking a regular hyperlink or form submit button.
Source: http://grails-plugins.github.io/grails-spring-security-core/guide/helperClasses.html