php – X-Requested-With头服务器检查是否足以防止针对ajax驱动的应用程序的CSRF?

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

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

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

当每个请求不刷新整个页面时,旋转令牌相当不方便。

我想我可以传递和更新独特的令牌作为一个全局的JavaScript变量与每个请求 – 但不知何故,感觉笨拙,似乎固有的不安全。

编辑 – 也许一个静态的令牌,像用户的UUID,会比没有更好吗?

编辑#2 – 正如罗克斯指出的那样,这可能是一个分裂的问题。我已经看到了两种方式的猜测,并听到关于旧版本的闪存被这种shenanigans可以利用的遥远的耳语。既然我什么也不了解,那么我可以为任何可以解释这是CSRF风险的人提供一个赏金。否则,我把它交给Artefacto。谢谢。

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

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

麦克不是毕竟不对,对不起。我没有阅读我正确链接的页面。它说:

A simple cross-site request is one that: […]
Does not set custom headers with the HTTP Request (such as X-Modified, etc.)

因此,如果设置了X-Requested-With,请求必须是预先启动的,除非您回应授权跨站点请求的飞行前OPTIONS请求,否则不会通过。

编辑Mike是对的,从Firefox 3.5开始,跨站点XMLHttpRequests为permitted.因此,您还必须检查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(); 
http://stackoverflow.com/questions/3315914/is-an-x-requested-with-header-server-check-sufficient-to-protect-against-a-csrf

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:php – X-Requested-With头服务器检查是否足以防止针对ajax驱动的应用程序的CSRF?