令牌会话和后置令牌总是不同,但来自相同的参数

时间:2014-12-19 14:57:16

标签: php forms session token

我为我的表单生成一个令牌:

/*** set a form token ***/
$token = md5( uniqid(rand(), true) );


/*** set the session form token ***/
$_SESSION['form_token'] = $token;

并将隐藏的输入放在我的表单中:

<input type="hidden" name="token" value="<?php echo $token; ?>" />

但是当我提交页面并比较令牌时,它会给我一个不同的令牌ID。谁能告诉我我做错了什么?

2 个答案:

答案 0 :(得分:0)

如果表单尚未提交,请确保仅(重新)生成令牌。

<?php
// Process request OR show form..
if($_SERVER['REQUEST_METHOD'] === 'POST') 
{
    // check if we receive a token
    if(isset($_POST['form_token'])) 
    {
        // compare the token
        if($_POST['form_token'] === $_SESSION['form_token']) 
        {
            // do the magic here...
            unset($_SESSION['form_token']);
        } else {
            die('No token match');
        }
    } else {
        die('No token found');
    }
} else {
    $token = md5( uniqid(rand(), true));
    $_SESSION['form_token'] = $token;

    // print form with hidden token..
}

答案 1 :(得分:0)

尝试在隐身窗口中访问您的网站。如果这样做,您需要删除所有浏览器&#39; Cookie和其他网站插件,因为您的会话已被缓存。它试图从较早的时间开始匹配会话。