检查用户是否使用正确的密码登录,或者是否有使用PHP的cookie


Check if user has logged in with right password OR has a cookie using PHP

当用户加载页面时,我想测试他们是否已经离开登录页面,或者他们的电脑上有一个cookie,说他们以前登录过,但后者似乎不起作用。

if ($pass === $PassConfirm || $_COOKIE['loggedIn'] == "true"){
 //Set cookie for logging in, (86400/24) lasts 1 hour
 setcookie("loggedIn", "true", time() + (86400 / 24), "/");
 /* Code to do stuff */
}else{
echo 'You are not logged in';}

这是我用来测试他们刚刚登录或有cookie的东西。如果我使用正确的密码从登录页面进入页面,它的加载就很好。然而,当检查cookie的值是否为"true"(它被设置为,当我在Chrome中查看页面的cookie时,我可以看到它被设置了)时,它会错误地说我没有登录。

如果你坚持使用cookie,你的代码结构需要一些严格的改进,那就顺其自然吧,但建议(在评论和其他人中)使用$_SESSION而不是cookie(因为它们的数据内容存储得更安全,并以同样的方式使用cookie与最终用户通信)。

将您的代码修改为现在所做的:

if (password match){
    //password check 
}
elseif (cookie match){
    //cookie check
}else {
    //unauthorised. (You should redirect).
}

所以

if (password_verify($pass, $PassConfirm)){
   /***
    Password is matched with the hash so now set the cookie
   ***/
   //set cookie - I will say more about this further down...
   setcookie("loggedIn", "true", time() + (86400 / 24), "/");
}
elseif ($_COOKIE['loggedIn'] == "true") {
   /***
   Cookie data found so assumed correct. carry on.
    ***/
}
else{
    echo 'You are not logged in';
    /***
    Some form of error handling. Typcially a header() statement and page redirection
    ***/
    header("Location: index.php");
    exit;
}
// Now your "rest of code" activity can begin here safe in the 
// knowledege that only people with passwords or cookies will reach this part.
  • 请阅读有关PHP密码验证和相应的Password_hash函数的信息。

  • 您的cookie检查可以也将被操纵,通过使用SESSIONS进行改进,SESSIONS还可以更轻松地处理生存期和登录和注销。

  • 对于else语句等失败状态,理想情况下不应停留在同一页面上,并通过中间页面将用户重定向到另一个页面,该页面将清除cookie/会话数据并"清理"其相关数据。

  • 请阅读setcookies手册中的注释,包括:

Cookie只有在下一次加载cookie应该是可见的。测试cookie是否成功设置,在cookie之前的下一个加载页面上检查cookie过期。Expire时间是通过Expire参数设置的。一个很好的方式通过简单地调用print_r($_COOKIE);。

Cookie必须使用相同的参数删除正如他们所设定的那样。如果值参数是空字符串,或者FALSE,并且所有其他参数与之前对setcookie的调用相匹配,则具有指定名称的cookie将从远程客户端。这是通过将值设置为"已删除",过期时间为过去一年。

因为设置值为FALSE的cookie将尝试删除cookie,您应该不使用布尔值相反,使用0表示FALSE,使用1表示TRUE

这应该足以让你清楚地知道你的饼干做错了什么:

  • 另请阅读:

如果在调用此函数之前存在输出,则setcookie()将失败并返回FALSE。如果setcookie()成功运行,它将返回符合事实的这并不表示用户是否接受cookie。

  • 因此,一个相关的原因是您的字符串cookie内容值看起来像一个布尔变量(由于PHP通常是松散的类型转换),所以请尝试使用数值等效的布尔值01,它应该会正确显示

因此:

  if(setcookie("loggedIn", 1, time() + 3600, "/", "", false, true)){
     print "Biscuit has been set!";
  } 

页面重新加载后(注意,您应该更新您的代码检查,进一步查看此代码示例,使其看起来与此处的文章[更]相似)

  if($_COOKIE['loggedIn'] == true){
       //cookie exists!
  }

如果您仍然有问题,那么我建议您在PHP页面顶部使用PHP错误日志和/或print_r($_COOKIE);

  • 使用会话。它们更容易、更安全
相关文章: