2016-05-17 117 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創建登錄名時,更改哈希值不能再次使用 –