如何在数据库中将cookie与令牌匹配?

时间:2015-08-23 23:39:57

标签: php mysql token

我写了以下脚本。一切都在我的应用程序中工作,除了验证继续返回登录。但是我已经阅读了很多关于我的问题的内容,而且一切看起来都是正确的,但当然应该有问题,否则它会正常工作。

在我的情况下,用户登录时,令牌存储在数据库和cookie中。 为了创建令牌,我使用:

bin2hex(openssl_random_pseudo_bytes(16));

我接下来要做的是设置一个页面,首先检查数据库中的cookie令牌和令牌是否匹配。为了确保我首先回应它们,并且两者都给出相同的标记。我是这样做的:

include 'mydatabase.php'; 
$cookie_name = "My_cookiename";
$result = mysql_query("SELECT * FROM users WHERE token='{$_COOKIE[$cookie_name]}'");
while($row = mysql_fetch_array($result)) {

echo $row['token'];
echo $_COOKIE[$cookie_name];

}

好的,所以我确信此时cookie令牌和数据库令牌匹配。 现在我想将它们与if/else进行比较。在这里我出错了,因为我无法让它发挥作用。我现在拥有的是:

$result = mysql_query("SELECT * FROM users WHERE token='{$_COOKIE[$cookie_name]}'");
while($row = mysql_fetch_array($result)) {
if ($row['token'] != $_COOKIE[$cookie_name]) { 
header('Location:myloginpage.php'); exit(); } else { // MY PAGE CONTENT IF MATCH }

我认为该行存在问题:

if ($row['token'] != $_COOKIE[$cookie_name])

任何帮助都会很棒,因为我真的很困难。

2 个答案:

答案 0 :(得分:3)

正如您对问题的评论所说,您正在不必要地检查事物。 mysql查询本身为您执行令牌检查

include 'mydatabase.php'; 
$cookie_name = "My_cookiename";
$result = mysql_query("SELECT * FROM users WHERE token='{$_COOKIE[$cookie_name]}'");
if (mysql_num_rows($results) != 1) {
    header('Location:myloginpage.php');
    exit();
}
// Content for your page goes here, no need for an else because of exit

答案 1 :(得分:0)

我想我刚刚解决了它:D 我遇到了同样的问题,我从随机令牌生成器中取出了&标志。当我用htmlentities()包围cookie字符串时,我注意到&的符号已替换为&amp,因为字符串通常读为&作为代码。一旦我从令牌中删除了&,它就起作用了。希望这会有所帮助。