【问题标题】:How to match cookie with token in database?如何将cookie与数据库中的令牌匹配?
【发布时间】:2015-08-23 23:39:57
【问题描述】:

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

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

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

【问题讨论】:

  • 你是在用setcookie设置cookie值吗?
  • 如果您得到与 cookie 匹配的令牌的返回值,则您不应该需要 if。是否有任何错误被抛出?
  • 这没有多大意义。您正在从数据库中选择 A 等于 B 的行,然后检查结果以查看 A 是否仍然等于 B。您肯定想检查是否有任何匹配项?例如mysql_num_rows
  • 是的,我使用 setcookie 来设置 cookie 值。奇怪的是,当我将它修改为 $result = mysql_query("SELECT * FROM users WHERE token='{$_COOKIE[$cookie_name]}'"); while($row = mysql_fetch_array($result)) if ($row['token'] != $_COOKIE[$cookie_name]) { echo "no match"; } else { echo "match"; } 时,当 cookie 和 db 匹配时,我得到了正确的回显。如果我修改数据库中的令牌,那么我根本没有回声,只是一个空白页。使用 error_reporting all 我完全没有错误:(

标签: php mysql token


【解决方案1】:

正如您问题中的 cmets 所说,您正在不必要地检查事情。 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

【讨论】:

  • 谢谢,成功了。我还将阅读建议的帖子。感谢您的帮助和建议!
  • 实际上,你不应该检查if (mysql_num_rows($results) == 0) ...你应该检查!= 1,因为2个或更多结果与0一样错误。
  • @Michael 你是对的,我对他的数据库架构做了一个假设,token 列被标记为UNIQUE。如果不是这种情况,那么检查您没有得到多个结果是必不可少的。但是应该注意,token 应标记为UNIQUE 作为该问题的首选解决方案
  • 我肯定同意它在数据库中应该有一个唯一的约束,但即使有这个约束,我仍然会理智地检查结果。 "应该是不可能的" != "不可能" 如果有人出现并且随后不正确地,甚至无意中删除了数据库约束,或者在极少数的数据库损坏情况下。我已经看到“不可能发生”在开发人员手中变成“确实发生”的次数太多了,他们天真地编码,好像预期的结果已成定局。
  • 公平点,我会调整代码:)。实际上,尽管对于这种类型的使用,我们无论如何都应该使用正确的 PHP 会话 :)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 2021-03-09
    • 2019-03-14
    • 1970-01-01
    • 2013-08-08
    相关资源
    最近更新 更多