Как обращаться с токеном безопасности CSRF на нескольких страницах

У меня есть сайт для обсуждения пользователей. На моем сайте очень много тем. Когда какой-либо пользователь открывает поток, генерируется токен безопасности 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']. Итак, если пользователь попытается оставить комментарий с ранее открытых страниц, он потерпит неудачу.

Каково решение этой проблемы?


person Rashid Farooq    schedule 28.04.2013    source источник
comment
Проверьте, как django справляется с этим.   -  person Piotr Jaszkowski    schedule 28.04.2013
comment
Вы генерируете токен один раз при настройке нового сеанса на сервере. Если это недостаточно безопасно, вы создаете токен для каждого запроса, но сохраняете их все в массиве. Затем вам понадобится дополнительный идентификатор запроса, чтобы проверить, действительно ли предоставленный токен был передан этой конкретной форме.   -  person arkascha    schedule 28.04.2013