CSRF保护:哈希PHPSESSID足够吗?

时间:2012-01-23 18:56:46

标签: php security xss csrf

只是想知道是否要求将散列的PHPSESSID发送到所有表单或操作脚本足以进行CSRF保护?我知道如果用户在同一个物理网络上(firesheep),可以获得这个。例如:

http://site.com/deleteMessage.php?mid=22&token=MD5ed_PHPSESSID

忽略同一网络问题PHPSESSID:

 1) Is known only to the user doing the action
 2) Can not be guessed by an attacker crafting a malicious img or request (<img src="http://site.com/deleteMessage.php?mid=22&token=I_DONT_KNOW_IT_:( )
 3) Can not be pulled on the same site assuming no XSS vulnerabilities exist.
 4) Can easily be pulled by the legitimate user (Javascript fills the form or GET var in the link)

3号让我担心,虽然我没有任何我所知道的XSS漏洞,因为我的所有内容($ string,ENT_QUOTES),我不喜欢依赖假设。这是足够的CSRF保护还是有更好的方法?

5 个答案:

答案 0 :(得分:3)

如果攻击者知道会话ID,那么他不必使用CSRF来影响受害者的会话。使用散列会话ID的不良做法,但它不是一个漏洞。您甚至可以使用会话ID,它在技术上不易受CSRF攻击。但它增加了失败的可能性,并防止这种失败是免费的。另一个加密随机数很容易生成。

除了使用capthca之外,XSS会破坏CSRF prevention cheat sheet上的所有保护方法。话虽这么说,您应该使用HTTP_Only cookie标志保护您的会话ID不受XSS的影响。

请记住,HTTP_only标志不会阻止XSS!,它只会使攻击更加困难。通常,攻击者会使用XHR来读取CSRF令牌以“骑”在会话上而不是劫持会话ID。

答案 1 :(得分:1)

防止CSRF的最简单方法是在加载带有要保护的表单的页面时向会话添加随机哈希。将该值添加到表单中,以便在用户提交时将其传递给该表单。将其与另一端的会话值匹配。

每次显示表单时重新生成此随机值。

这是有效的,因为如果用户离开并返回,移动到新表单,无论如何,表单将始终与创建的最后一个值匹配,而后者将与您检查的值相同。

你的建议可能会有所帮助,但你提到的方式仍然很脆弱。为什么允许任何漏洞?

答案 2 :(得分:1)

不,您应该使用独立于会话ID的令牌。试想一下攻击网站能够以某种方式获取受害者的会话ID(参见session fixationsession hijacking)但由于一些额外的会话保护措施而无法使用会话本身的情况。然后,仍然可以伪造真实的请求,因为令牌可以从已知的会话ID派生。

每个人都建议使用随机令牌。

答案 3 :(得分:1)

根据Robust Defenses for Cross-Site Request Forgery by Barth, Jackson and Mitchell,会话标识符的HMAC似乎是最佳通用解决方案。

根据该文章,即使使用TLS / SSL / HTTPS,与服务器状态存储中的会话ID不匹配的会话独立现时也容易受到主动网络攻击。会话标识符的HMAC没有类似的漏洞。只要您将nonce与服务器上的会话ID匹配,而不是使用带有POST标头的ma Cookie参数,会话无关nonce就可以了。

答案 4 :(得分:0)

使用散列PHPSESSID以外的令牌,然后将令牌存储在会话中。此外,令牌只应对单次提交有效。