【问题标题】:Different values been given for cookies为 cookie 提供了不同的值
【发布时间】:2015-07-31 16:59:22
【问题描述】:

我不知道我的 cookie 发生了什么,我基本上有一个生成随机代码的系统,将其存储在 cookie 和数据库中。当用户重新登录时,连同用户名/密码身份验证,此 cookie 也必须与数据库匹配才能通过登录阶段(它基本上是一个授权某些机器访问的系统)。

问题是:基本上,我已经设置了一个方法,在我登录之前检查cookie数据,它只是一个打印cookie数据的页面,我无需登录即可访问。这个位于'/includes/ check_cookies.php'。我也有主要的登录脚本,这意味着在任何事情之前读取cookie数据并查看'auth_code'是否与数据库条目匹配,如果匹配,则允许访问提供用户名和密码正确等等等,如果不匹配' t,它将生成一个新的 'auth_code' 并将其存储在一个表和 cookie 中。这取决于用户是管理员还是标准用户,管理员可以在那里进行身份验证,然后标准用户不能。假设我现在是第一次登录,我是管理员,所以可以授权自己,它很管用,我可以顺利注销并重新登录。但是,如果我今晚回家,明天早上回来,尝试登录,我会被告知我的计算机没有再次获得授权,即使在检查时,cookie 条目与我的 check_cookies 文件中的数据库匹配,但是在登录脚本中生成一个新的?我真的很困惑。

但无论如何,这是相关代码(我将使用管理员代码):

$auth_code = $_COOKIE['auth_code'];
echo $auth_code . "<br>";

// Check Cookie Auth Code Vs Database Auth Code
$auth_query = "SELECT * FROM authorised_computers WHERE auth_code = '".$auth_code."';";
$auth_result = mysqli_query($link,$auth_query);
if($auth_result->num_rows == 0) {
    $auth = 0;
} else {
    $auth = 1;
}

if($auth == 1) {
    setcookie('admin',$admin,$cookie_expire,'/');
    setcookie('login_time',$date,$cookie_expire,'/');
    $_SESSION['logged_in'] = "true";
    header('Location: ../logs.php');
} elseif($auth == 0) {
    setcookie('auth_code',$no_generator,$cookie_expire,'/');
    setcookie('admin',$admin,$cookie_expire,'/');
    setcookie('login_time',$date,$cookie_expire,'/');
    $_SESSION['logged_in'] = "false";
    header('Location: admin_auth.php'); 
}

基本上,代码将 $auth 设置为 '0' 并遵循该路线。

以下是登录脚本中的 cookie 数据:

    Array
(
    [auth_code] => 13367320 // Does not match database
    [admin] => 1
    [acc_id] => 1
    [user_id] => 10001
    [login_time] => 2015/07/29 10:25:20
)

以及登录尝试前的 cookie 数据:

Array
(
    [auth_code] => 342221-32 // Matches the Database
    [admin] => 1
    [acc_id] => 1
    [user_id] => 10001
    [login_time] => 2015/07/29 10:25:35
)

基本上,不应该生成新的授权代码,因为 cookie 数据已经与数据库匹配,所以应该直接通过。

我感觉这可能是 cookie 过期的问题,但我已将 cookie 设置为:$cookie_expire = time() + (21*365*24*60*60);所以他们不应该。我可能遗漏了一些明显的东西,但话又说回来,我对 Cookies 的理解并不是最好的。任何帮助将不胜感激!

【问题讨论】:

  • echo $auth_code . "&lt;br&gt;";
  • 你能解释一下为什么吗?它目前工作并输出:13367320..这是正确的。
  • 您不能在setcookie() 之前向输出缓冲区发送任何内容应该 导致Headers already sent 错误:stackoverflow.com/questions/8028957/…
  • 很公平,有道理,我会试一试,当我不断登录和退出时,我仍然对它在一天中的工作方式感到有些困惑,但只要有一个新的一天开始,然后我必须重新授权......另外,我打开了错误,并且没有任何错误返回。我将在 setcookie() 函数之后删除输出,明天再试一次。谢谢:)
  • 另外 - 有趣的是,由于您似乎将 cookie 设置为在 21 年后过期,您可能会在 32 位软件上遇到 Y2038 问题:en.wikipedia.org/wiki/Year_2038_problem(如果您的服务器是配置了错误的日期)...尝试将其设置为 1 年。

标签: php authentication cookies


【解决方案1】:

在检查我的代码后,我发现我在登录时重新设置了 cookie,因此更改了“cookie 代码”,使其不匹配。我已经删除/重新编写了登录脚本,一切似乎都在正常工作。只需要明天早上重新测试一下,看看问题是否再次出现。

感谢大家的意见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    相关资源
    最近更新 更多