267

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

X-Requested-With: XMLHttpRequest

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

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

4

3 回答 3

299

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

跨源仅允许以下标头:

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

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

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

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

发现新的 Flash 旁路

您可能希望将此与令牌结合使用,因为如果存在重定向步骤,则在 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的更深入的博客文章。

于 2014-03-20T12:54:59.693 回答
33

确保您阅读 SilverlightFox 的答案。它突出了一个更重要的原因。

原因主要是如果您知道请求的来源,您可能想要稍微自定义它。

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

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

现在您可以只为数据编写一个辅助端点,www.example.com/recipe_only/apple_pie但是这更难维护和分享给其他人。

但是更容易检测到它是一个发出请求然后只返回一部分数据的ajax请求。这样,用户浪费的带宽更少,网站的响应速度更快。

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

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

于 2013-07-04T22:48:41.793 回答
13

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

于 2015-01-28T09:00:02.440 回答