【发布时间】:2012-05-15 00:37:17
【问题描述】:
所以我正在阅读并且对拥有 CSRF 令牌感到非常困惑,我应该为每个请求生成一个新令牌,还是每小时生成一个新令牌?
$data['token'] = md5(uniqid(rand(), true));
$_SESSION['token'] = $data['token'];
但是假设最好每小时生成一个令牌,那么我需要两个会话:令牌,到期,
我将如何处理表格?只需将 echo $_SESSION['token'] 放在隐藏值表单上,然后在提交时进行比较?
【问题讨论】:
-
请注意,如果用户同时在两个不同的浏览器窗口中打开您的应用程序,则为每个请求生成一个新令牌可能会导致问题。令牌将不同步。
-
@Michael 这个问题可以通过推送技术,html 5 通信标准来解决。
-
如果安全性不高,只需取一个哈希值,例如用户的 ip 和他的密码哈希。这可能永远不会或很少改变,但它仍然可以发挥作用,因为攻击者不会知道用户的密码(如果知道,他不需要对他执行 CSRF 攻击)
-
@ThiefMaster:有什么理由对真实数据(如用户的 ip 或密码)进行哈希处理而不生成随机数据?
-
是的,这样你就不需要存储令牌了。而且它不会经常更改 => 对于使用后退按钮和多个标签的用户来说更舒适。