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/>';
}
为什么?
答案 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;
}
然后你可以比较你要检查的条件。