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

时间:2016-05-11 15:53:18

标签: php cookies

当用户加载页面时,我想测试他们是否已经离开登录页面,或者在他们的PC上有一个cookie,说他们之前已经登录过,但是后者似乎无法正常工作。< / p>

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的值是&#34; true&#34; (它被设置为,当我在Chrome浏览器中查看我的Cookie时,我可以看到它已设置)它错误地说我没有登录。

1 个答案:

答案 0 :(得分:1)

如果您坚持使用cookie,您的代码结构需要进行大量的改进,所以可以,但建议(在评论和其他人中)使用$_SESSION instead of cookies(因为他们的数据内容存储更安全,使用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 Verify和相应的Password_hash功能的信息。

  • 您的cookie检查可以并且将被操纵,通过使用SESSIONS进行改进,SESSIONS也可以更轻松地处理生命周期和登录和退出。

  • 对于失败的状态,例如else语句,您理想情况下不应该停留在同一页面上,并通过中间页面将用户重定向到另一个页面,这将清除cookie /会话数据和#34 ;清洁&#34;他们的相关数据。

  • 请阅读setcookies的{​​{3}},包括:

  

在下次加载页面之前,Cookie才会显示   cookie应该是可见的。测试cookie是否成功   设置,检查cookie之前的下一个加载页面上的cookie   到期。过期时间通过expire参数设置。一个很好的方式   通过简单调用来调试cookie的存在   的print_r($ _ COOKIE);.

     

必须使用相同的参数删除Cookie   正如他们所设定的那样。如果value参数是空字符串,或者   FALSE和所有其他参数匹配之前调用setcookie,   那么具有指定名称的cookie将从中删除   远程客户端。这是通过将值设置为内部实现的   &#39;删除&#39;到期时间为一年。

     

因为设置了一个   值为FALSE的cookie会尝试删除cookie   不要使用布尔值。 相反,使用0表示FALSE,使用1表示TRUE

这应该足以让您清楚了解您的Cookie是否已经出错:

  • 同时阅读:
  

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

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

所以:

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

在页面重新加载之后(请注意,您应该更新代码,请进一步检查此代码示例,以便在此处查看[更多]与此相似的内容)

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

如果您仍然遇到问题,我建议您在PHP页面顶部使用notes from the manual和/或print_r($_COOKIE);

  • 使用会话。它们更容易,更安全。