会话变量失败,php问题

时间:2011-10-18 11:45:12

标签: php forms session

session_start();
$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;

这就是我启动代码的方式。

然后,我将$ token变量传递给表单中的隐藏字段:

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

但这种情况永远不会成真:

if($_POST['token'] == $_SESSION['token'])
{       
        echo 'Session was valid<br/>';
}

为什么?

5 个答案:

答案 0 :(得分:3)

因为您在检查之前重新生成令牌。你确定它不一样后你必须改变它

答案 1 :(得分:2)

在页面提交时,将为会话分配一个新值。

尝试,

session_start();
if(!isset($_SESSION['token']))
{
 $token = md5(uniqid(rand(), TRUE));
 $_SESSION['token'] = $token;
}

答案 2 :(得分:1)

尝试将$_SESSION['token']回显到表单而不是$token,以防您在创建令牌和表单输出之间意外重新分配它。

当我开发的东西花了我很多年才找到时,我曾经遇到过与此非常相似的问题,结果发现这是因为我留下了<img src=''>,因为我还没有图像 - 这导致再次请求页面,因为空src表示“此页面”,因此在页面加载后重新生成令牌。

要检查的另一件事是,如果缺少表单的action属性,或者某个值指向自身,则在if (...)语句之前提交表单时可能会重新生成该标记。

答案 3 :(得分:0)

您可以执行以下操作,以防止在每次加载页面时重置令牌:

session_start();
if (!isset($_SESSION['token']))
{
    $token = md5(uniqid(rand(), TRUE));
    $_SESSION['token'] = $token;
}

但是......你可能会更好session.referer_check或者使用一些开源会话类,它包含更细粒度的安全性,而不是在程序标准之上。 (如果操作正确,您的代码将无需在实际使用会话的任何地方进行更改。) 有关详细信息,请参阅php.net/session_set_save_handler

答案 4 :(得分:0)

您提供的代码位于一个文件中,您将其提交给自己。 重新生成令牌并分配给会话变量。正如“AVD”所说,是防止重新分配的代码

session_start();
if(empty($_SESSION['token'])){
    $token = md5(uniqid(rand(), TRUE));
    $_SESSION['token'] = $token;
}

然后你可以比较你要检查的条件。