2010-07-19 34 views
0

我一直在使用CodeIgniter開發一個網站的登錄庫。驗證碼如下:在PHP和MySQL中醃製

function signin($username, $password) 
{ 
    $CI =& get_instance(); 
    $query_auth=$this->db->query('SELECT user_id, banned FROM user WHERE username=? AND password=SHA1(CONCAT(?,salt)) LIMIT 1', array($username, $password)); 

    if($query_auth->num_rows()!=1) 
     return 2; 
    else 
    { 
     if($query_init->row()->banned==1) 
      return 3; 
     else 
     { 
      $CI->load->library('session'); 
      $this->session->set_userdata('gauid', $query_auth->row()->user_id); 
      return 1; 
     } 
    } 
} 

返回值表示成功,失敗或被禁止。每個用戶在數據庫中都有獨特的鹽。

本來我是從數據庫中攫取了鹽,將用戶輸入的密碼和salt中的鹽從PHP中的數據庫中合併,然後再用合併後的值查詢數據庫。我認爲這會加快速度,因爲只需要一次數據庫訪問並且代碼少。我也認爲這將是同樣安全,讀最頂級的效應初探這個問題 Salting my hashes with PHP and MySQL但是之後...

首先,你的DBMS(MySQL的)不 並不需要有 加密任何支持哈希值。你可以在PHP端執行所有的 ,這也是你應該做的 。

...我開始懷疑是否有安全問題,我忽視了現貨。

這段代碼實際上有什麼不對嗎?

+0

可能重複的[安全散列和鹹的PHP密碼](http://stackoverflow.com/questions/401656/secure-hash-and-salt-for-php-passwords) – rook 2010-07-19 19:34:57

+0

我不明白這是怎麼回事真正!這些問題是完全不同的。 – j82374823749 2010-07-19 19:44:03

+0

然後它應該被關閉,因爲太局部。 – rook 2010-07-19 19:46:09

回答

2

本身沒有任何問題。請記住任何攜帶未加密/未加密密碼的流量都是可疑的。因此,例如,當服務器是遠程服務器,而不是與加密服務器通信時,它是嘗試截取密碼的又一時刻。另外,如果查詢記錄在某處(默認情況下,或者因爲它們很慢),那麼您有一個普通的密碼+您正在使用的salt坐在這些serverlog中,在經歷了所有麻煩之後,您不需要存儲明文密碼某處。如果你在自己的代碼中私下執行,那不會發生。

這一切都取決於你喜歡怎麼偏執。虐待事件要容易得多,而且經常會忘記邪惡事件,如會話固定。

+0

對不起,本身就是寵物。 :) – 2010-07-19 19:33:06

+0

只要你正在考慮像這樣的安全問題,我不會把所有密碼嘗試記錄在明文中作爲次要事情。否則如上所述同意。 – 2010-07-19 19:34:48

+0

hashing!=加密 – rook 2010-07-19 19:36:19