如何将 cookie 与数据库中的 token 进行匹配?

How to match cookie with token in database?

我写了下面的脚本。在我的应用程序中一切正常,除了验证不断返回登录。但是我已经阅读了很多关于我的问题的信息,一切似乎都是正确的,但当然应该有问题,否则它会正常工作。

在我的例子中,用户登录时,令牌存储在数据库和 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])

任何帮助都会很棒,因为我真的被困在这一点上。

正如对你问题的评论所说,你在检查不必要的东西。 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

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