当前位置: 首页 > 面试题库 >

X-Requested-With标头服务器是否足以防止Ajax驱动的应用程序受到CSRF的攻击?

沈琛
2023-03-14
问题内容

我正在开发一个完全由ajax驱动的应用程序,其中所有请求都通过一个基本上等于一个主控制器的主控制器,该主控制器看起来像这样:

if(strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
    fetch($page);
}

这通常足以防止跨站点请求伪造吗?

当没有随每个请求刷新整个页面时,具有旋转令牌是很不方便的。

我想我可以在每次请求时都将唯一令牌作为全局javascript变量传递和更新-但是以某种方式感到笨拙并且似乎本质上不安全。

编辑-也许像用户的UUID这样的静态令牌总比没有好?

编辑#2-正如 The Rook
指出的那样,这可能是一个令人毛骨悚然的问题。我已经阅读了两种方式的猜测,并听到了关于低版本Flash可用于这种恶作剧的遥远的耳语。由于我对此一无所知,因此我向所有可以解释这是CSRF风险的人悬赏。否则,我会将其交给
Artefacto 。谢谢。


问题答案:

我会说就足够了。如果允许跨域请求,那么您将注定要失败,因为攻击者可能会使用Javascript来获取CSRF令牌并将其用于伪造的请求中。

静态令牌不是一个好主意。每个会话至少应生成一次令牌。

EDIT2 Mike毕竟不对,抱歉。我没有正确阅读链接到的页面。它说:

一个简单的跨站点请求是这样的:[…]不使用HTTP请求设置自定义标头(例如X-Modified等)。

因此,如果您设置了X-Requested- With,则该请求必须是预先执行的,除非您响应OPTIONS授权跨站点请求的飞行前请求,否则该请求将无法通过。

编辑 Mike是正确的,从Firefox
3.5开始,允许跨站点XMLHttpRequests
。因此,您还必须检查Origin标题(如果存在)是否与您的站点匹配。

if (array_key_exists('HTTP_ORIGIN', $_SERVER)) {
    if (preg_match('#^https?://myserver.com$#', $_SERVER['HTTP_ORIGIN'])
        doStuff();
}
elseif (array_key_exists('HTTP_X_REQUESTED_WITH', $_SERVER) &&
        (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'))
    doStuff();


 类似资料:
  • 问题内容: jQuery和其他框架添加以下标头: X-Requested-With:XMLHttpRequest 为什么需要这个?为什么服务器要对AJAX请求与常规请求区别对待? 更新 :我刚刚找到了一个使用此标头的真实示例:https : //core.spreedly.com/manual/payment-methods/adding- with-js 。如果要求付款处理器不使用AJAX,则完

  • 问题内容: 在 **http://www.a.com/service.asmx 上创建一个Web服务,并从 **http://www.b.com 向其发送跨域ajax请求。检查 Firebug 或 Live HTTP Headers中的标题 ,或您想要的任何其他插件。 在请求标头中没有 X-Requested-With HTTP标头字段的踪迹。 但是,如果您从同一域向同一服务发送ajax请求(例如

  • 我们正在用运行在JBoss中的Java Spring/Hibernate后端构建一个应用程序。前端是AngularJS。 我们还没有在服务器端设置XSRF令牌。我们也没有(无论如何还没有)允许其他域访问我们的web资源的要求。 我想我会试着看看我们的站点是否容易受到XSRF攻击,所以我设置了一个恶意的webapp,使用Angular的$http.post()发布到我们真正应用程序的URL中。我登录

  • 问题内容: 我想知道是否有人尝试从jquery(或普通JS)发出的ajax请求中删除“ X-Requested-With”标头。可能吗? 第二部分:您是否知道Grease Monkey的ajax请求是否设置了此标头? 谢谢 标头看起来像这样: 问题答案: “第二部分:您是否知道Grease Monkey的ajax请求是否设置了此标头?” 不,Greasemonkey不会设置此标头(尽管您当然可以添

  • 问题内容: 使用AntiForgeryToken要求每个请求都传递一个有效的令牌,因此带有简单脚本将数据发布到我的Web应用程序的恶意网页将不会成功。 但是,如果恶意脚本首先发出一个简单的GET请求(由Ajax发出),以便在隐藏的输入字段中下载包含防伪令牌的页面,然后将其提取出来并用于进行有效的POST,该怎么办? 是否有可能,或者我缺少什么? 问题答案: 是的,这就是您需要做的。 只要您在每个受

  • 禁用SSLv2协议是否足以保护我的应用程序免受溺水攻击? 如果用户尚未在其所有SSL/TLS服务器中禁用SSLv2协议,则可以通过禁用SSLv2协议来避免此问题。禁用所有SSLv2密码也足够了,前提是已经部署了CVE-2015-3197的修补程序(在OpenSSL 1.0.1R和1.0.2F中已修复)。未禁用SSLv2协议且未为CVE-2015-3197打补丁的服务器,即使名义上禁用了所有SSLv