我有一个用户讨论网站。我的网站上有很多线程。当某些用户打开一个线程时,正在生成一个 CSRF 安全令牌以在评论表单中使用
if (!isset($_SESSION['token'])) {
$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;
$_SESSION['token_time'] = time();
}
else
{
$token = $_SESSION['token'];
}
我在这样的评论形式中使用这个安全令牌
<form action="comment.php" method="post">
<input type="hidden" name="token" value="<?php echo $token; ?>" />
<input type="text" name="comment_body" value="" />
</form>
并且在接收端
if ($_POST['token'] == $_SESSION['token']){
/* Valid Token */
}
现在,问题是,如果用户打开多个线程(页面),则 中的值$_SESSION['token']
将是从最后一页生成的值,并且所有先前打开的页面都将丢失$_SESSION['token']
. 因此,如果用户试图从以前打开的页面发表评论,他将失败。
这个问题的解决方案是什么?