2016-05-17 86 views
1

我向你求助,我解释我的问题。在我的User()类中,我写了一个小函数来登录,然后记录会话并设置cookie。会话丢失用户登录

这就是:

public function login($username, $password) { 
    $this->db->query("SELECT * FROM users WHERE username = :username AND status = :status LIMIT 1"); 
    $this->db->bind(':username', $username); 
    $this->db->bind(':status', 1); 
    $row = $this->db->single(); 
    $count = $this->db->rowCount(); 
     if ($count > 0) { 
      if (password_verify($password, $row['password'])) { 
       $this->setSession($row); 
       return true; 
      } else { 
       return false; 
      } 
     } 
} 

public function setSession($row) { 
    $_SESSION['session'] = [ 
     'id' => $row['id'], 
     'username' => $row['username'], 
     'email' => $row['email'] 
    ]; 
    //set cookie 
    setcookie("name_cookie", md5($_SESSION['session']['username']/$_SESSION['session']['password']), time()+3600 * 24 * 365); 
} 

这里是检查功能,如果用户连接与否,来保护网页:

public function isLoggedIn() { 
    if(isset($_SESSION['session'])) { 
     return true; 
    } 
    return false; 
} 

我的问题是,即使饼干被设置,不幸的是该会话在总时间到期之后。

我将Cookie设置为一年,但正如我所说的,用户的登录会话在一段时间后过期。我该如何解决这个问题?

+0

session_start()代码是在哪里? –

+0

在includes/config.php中。日志可以持续约40分钟,或多或少,之后您必须再次登录。 –

+0

你为什么使用setcookie函数。 PHP自动将PHPSESSID设置为cookie变量。你只是在setSession函数中打印session_变量 –

回答

0

PHP会话在服务器级别到期。默认大约20分钟,你可以在你的php.ini设置中控制它。

您可以使用setcookie将cookie保存到用户的浏览器,然后使用PHP中的$_COOKIE变量进行检查。见setcookie

但是请注意安全隐患。任何人都可以窃取cookie,然后以该用户的身份访问该网站。保护你的cookie的一些好的想法可以是found here

+0

你好,我想做这些改变是因为它不熟悉,但是,它是一种更安全的方法来保护页面。 –

+0

目前,我的班级可以超过最低安全要求吗?我知道这不是最高的,但要确保最低限度? @Andreas Huttenrauch –

+0

我会建议至少: (1)为每个客户生成独特的哈希值并仅保存cookie中的哈希值,并且(2)当您使用cookie创建登录名时,更改哈希值不能再次使用 –