2010-11-20 72 views
0

什麼是創建安全用戶身份驗證功能的最佳方式?下面是一個php函數的核心,它接受用戶名和密碼並根據數據庫進行檢查。最安全的php用戶身份驗證功能

我特別感興趣的是查詢及其返回值。是否使用'else if($ query1)'驗證和設置會話變量的最佳方式?另外,最好爲會話變量設置什麼值?電子郵件地址,用戶名,布爾變量,主鍵索引等?

$query1 = mysql_fetch_array(mysql_query("SELECT primaryKey 
              FROM loginInfo 
              WHERE email = md5('$email') 
              AND password = md5(CONCAT('$password',salt)) 
              LIMIT 1")); 
if (!$query1) 
    return false; 
else if ($query1) { 
    $_SESSION['userNumber'] = $query1[primaryKey]; 
    return true; 
} 
else 
    return false; 

回答

1

MD5已知漏洞,不再被認爲是安全的。您應該切換到更強大的哈希,如SHA-2

此外,$query1只能評估爲真或假,所以最終else部分是無用的,永遠不會達成。你的3個分支相當於只是這樣的:

if (!$query1) 
    return false; 
else { // else $query1 is obviously true 
    $_SESSION['userNumber'] = $query1[primaryKey]; 
    return true; 
} 

有沒有這樣的事,作爲一個「最佳價值」在會話存儲,但主鍵通常是一個方便的選擇,因爲它是保證是唯一還提供了一種查看其餘詳細信息的簡單方法。此外,如果您發現自己經常顯示某些信息(如用戶名),則可以將其存儲在會話中以便於訪問。

1

有多個問題與此代碼:

  • SQL注入漏洞。 (當用戶輸入電子郵件地址') OR 1=1 OR '' = ('時會發生什麼?)您應該看看mysql_real_escape_string,或考慮使用參數化查詢。
  • 你永遠不會調用上的資源mysql_free_resultmysql_query返回,這將泄漏的MySQL服務器上的資源(直到腳本終止),並可以防止在同一腳本將來的查詢的執行。
  • MD5由於漏洞而被棄用。考慮在SHA系列中使用散列代替。
+0

sha1是目前在PHP中SHA家族中唯一的散列函數嗎? – Tableking 2010-11-20 05:23:34

+0

否。請參閱['hash()'](http://php.net/manual/en/function.hash.php)和['hash_algos()'](http://us.php.net/ manual/en/function.hash-algos.php)函數。如果您的數據庫不支持您選擇的相同散列函數,則可能需要將值提取到PHP腳本中,然後再運行另一個查詢......所以請仔細選擇。在我看來,SHA1目前非常安全。 – cdhowie 2010-11-20 06:30:07

0

這取決於攻擊者可以訪問的位置。如果他以某種方式訪問​​數據庫,則建議對散列類型的更改很重要。

如果他沒有,它限制,以避免暴力破解攻擊失敗的登錄次數更重要。

但是,cdhowie指出的漏洞必須根本修復。

+0

我應該注意,爲了簡單起見,我減少了代碼。我將$ email和$ password變量傳遞給已針對注入漏洞進行了清理的函數。我實際上使用SHA1。雖然,我沒有調用mysql_free_result。 – 2010-11-20 04:18:32