1

我有一个用户讨论网站。我的网站上有很多线程。当某些用户打开一个线程时,正在生成一个 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']. 因此,如果用户试图从以前打开的页面发表评论,他将失败。

这个问题的解决方案是什么?

4

0 回答 0