2011-01-14 161 views
2

這是我目前在登錄頁面上創建會話的內容。PHP會話安全提示

if($count==1) { 

    $_SESSION['username'] = $username; 
    $_SESSION['password'] = $password; 
} 

我知道這是非常基本的,我需要保護用戶會話。你能否提供一些基本的提示。如果您可以編輯代碼並編寫安全代碼,那就太好了。謝謝。

目前,我使用的電子郵件地址作爲用戶名的會話。

+0

那麼你爲什麼要在/ tmp中以純文本形式存儲密碼? – rook 2011-01-15 20:48:33

回答

6

問問你自己這個問題:

  • 爲什麼我保存密碼時的用戶名在數據庫中唯一

後你已經回答了,你應該的得出的結論,其毫無意義,您可以在會話中存儲用戶名或用戶標識。

登錄系統如何工作的原因是用戶將表單中的用戶名密碼發送到驗證的服務器,在驗證過程中您從數據庫where username = post_username中選擇用戶。

如果沒有行發現用戶不存在,那麼你可以直接在該點發送輸出,如果用戶確實存在,你再與post_password比較密碼。

爲什麼我們專門僅由用戶名選擇該行的原因是,你應該納入某種散列系統添加額外的安全性。

如果您將密碼存儲爲(密碼+散列)這將是一個新的字符串,您還將只存儲哈希,因此如果找到用戶,則可以從(post_password + db_hash)創建一個哈希,並檢查以查看是否它與db_password相同。

這樣,如果你的數據庫被泄露莫名其妙您的用戶憑據是更安全的。

一旦用戶已經過驗證,您將在會話中存儲用戶標識,然後在每次加載頁面時,您都可以檢查該標識是否在會話中,如果用戶當前已登錄,您可以選擇用戶數據由SELECT * FROM users WHERE id = session_id

這應該讓你開始。

1

常見的做法是在會議上針對數據庫檢查用戶名和密碼,然後成功店不僅僅是用戶ID。然後,要查看某個人是否已登錄或授權,請檢查會話中存儲的用戶標識。雖然,會話變量只對服務器可見,除非你做了一些可怕的錯誤。所以它不可怕或不安全,但它基本上是不必要的。

編輯

刪除了關於cookies位,可能會引起混淆。

+0

爲什麼我不能簡單地存儲用戶名而不是ID?我沒有使用cookie。 – sarthak 2011-01-14 21:26:37

+0

@sarthak:因爲通過主鍵而不是一組其他列查詢表通常更好更快。如果您使用此會話進行身份驗證,則意味着您還使用了Cookie,否則它沒有任何意義。 – jweyrich 2011-01-14 21:32:13

+1

你可以,但我不會,除非你的主鍵,你通常需要一個INT類型的主鍵。 – profitphp 2011-01-14 21:32:42

1
/* 
    SecureSession class 
    Written by Vagharshak Tozalakyan <[email protected]> 
    Released under GNU Public License 
*/ 

class SecureSession { 
    // Include browser name in fingerprint? 
    var $check_browser = true; 
    // How many numbers from IP use in fingerprint? 
    var $check_ip_blocks = 0; 
    // Control word - any word you want. 
    var $secure_word = 'random_string_here'; 
    // Regenerate session ID to prevent fixation attacks? 
    var $regenerate_id = true; 

    // Call this when init session. 
    function Open() 
    { 
     $_SESSION['ss_fprint'] = $this->_Fingerprint(); 
     $this->_RegenerateId(); 
    } 

    // Call this to check session. 
    function Check() 
    { 
     $this->_RegenerateId(); 
     return (isset($_SESSION['ss_fprint']) 

     && $_SESSION['ss_fprint'] == $this->_Fingerprint()); 
    } 

    function Destroy() 
    { 
     // Unset all of the session variables. 
     $_SESSION = array(); 

     // If it's desired to kill the session, also delete the session cookie. 
     // Note: This will destroy the session, and not just the session data! 
     if (isset($_COOKIE[session_name()])) { 
      setcookie(session_name(), '', time()-42000, '/'); 
     } 

     // Finally, destroy the session. 
     session_destroy(); 
    } 


    // Internal function. Returns MD5 from fingerprint. 
    function _Fingerprint() 
    { 
     $fingerprint = $this->secure_word; 
     if ($this->check_browser) 
      $fingerprint .= $_SERVER['HTTP_USER_AGENT']; 

     if ($this->check_ip_blocks) 
     { 
      $num_blocks = abs(intval($this->check_ip_blocks)); 

      if ($num_blocks > 4) 
       $num_blocks = 4; 

      $blocks = explode('.', $_SERVER['REMOTE_ADDR']); 

      for ($i=0; $i<$num_blocks; $i++) 
      { 
       $fingerprint .= $blocks[$i] . '.'; 
      } 
     } 
     return md5($fingerprint); 
    } 

    // Internal function. Regenerates session ID if possible. 
    function _RegenerateId() 
    { 
     if ($this->regenerate_id && function_exists('session_regenerate_id')) 
      session_regenerate_id(); 

    } 
}