如何改进我的用户登录方案

时间:2011-06-14 10:07:39

标签: php session login session-cookies

问题简单易懂。多年来我一直在使用PHP会话,我总是以这种方式管理用户登录/注销:

  1. 开始会话(session_start()致电)。
  2. 登录:在会话中存储值(即$_SESSION["user_id"] = 34)。
  3. 检查用户已记录:检查会话值(即isset($_SESSION["user_id"]))。
  4. 退出:销毁会话(session_destroy()来电和unset($_SESSION["user_id"]))。
  5. 这个方案对我来说非常简单,但是现在我正在开发一个更大的应用程序,这种方法有点问题。例如,我无法在登录框中实现“记住”复选框,因为我能够设置更大的会话cookie到期日期,但会话更快结束($_SESSION["user_id"]未设置)。< / p>

    关键是,如何改进这个方案或哪个是用PHP管理用户会话的标准方案?

2 个答案:

答案 0 :(得分:4)

您的方法对于正常会话非常好。这里有问题的是“记住我”功能,需要以不同于普通会话的方式处理。

实现该功能的一种常用方法是存储具有远期过期日期的第二个cookie,并将用户ID加上安全哈希。您需要用户ID或其他标识来检测哪个用户返回,但您还需要安全哈希,以确保该Cookie是您的Web应用设置并且尚未手动制作的。 如果您没有安全哈希,人们可以发送带有用户ID的自建cookie并自动登录。

因此,安全哈希需要包含只有您的Web应用程序知道的信息,即用户创建日期。

你可能想这样做:

$cookieValue = (int)$user->id . ':' . md5($user->creationDate . '/' . $user->passwordHash);

由于creationDatepasswordHash都没有更改,因此您可以在用户尝试通过cookie登录时验证安全哈希的有效性。当用户更改密码时,密码哈希值会发生变化,用户需要一个新的cookie - 这在我看来非常好,因为偷走cookie的人也会被注销。

如果您想要其他安全性,请使用其他值创建哈希值,即您与其他用户数据一起存储的特殊Cookie哈希值。您可以完全随机创建它,并且应该在用户登录时更改它:

$randomValue = md5(time() . rand() . $user->passwordHash);
$user->setCookieValue($randomValue);
$cookieValue = (int)$user->id . ':' . $randomValue;

现在登录时:

list($userId, $hash) = explode(':', $cookieValue);
$user = loadUser($userId);
if ($user instanceof User && $user->cookieValue == $hash) {
    //user logged in
    //generate and set new cookie value
} else {
    // handle invalid persistent cookie
}

答案 1 :(得分:0)

很简单,只需更改您的代码如下:

  
      
  1. 查看$ _SESSION [“user_id”]是否包含值
  2.   
  3. 如果没有,请查看cookie是否包含真实用户数据,如果是,则存储在会话中   登录
  4.