我写了以下脚本。一切都在我的应用程序中工作,除了验证继续返回登录。但是我已经阅读了很多关于我的问题的内容,而且一切看起来都是正确的,但当然应该有问题,否则它会正常工作。
在我的情况下,用户登录时,令牌存储在数据库和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])
任何帮助都会很棒,因为我真的很困难。
答案 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字符串时,我注意到&
的符号已替换为&
,因为字符串通常读为&
作为代码。一旦我从令牌中删除了&
,它就起作用了。希望这会有所帮助。