2011-04-15 107 views
0

我知道的人 -登錄驗證算法

SELECT * FROM log_records WHERE 'username'=uname AND 'password'=pass; 
if(row_count==1) 
    return true; 
return false; 

的問題是:

  • 是上述算法一個 '最佳實踐'?
  • 是否有任何替代上述算法?

謝謝!

+0

順便說一句,什麼平臺你在開發?如果您在環境中標記問題,您可能會得到更具體的指導,因爲許多平臺已經提供了認證/成員身份機制。你的大部分問題似乎都與PHP有關......假設你正在尋找特定於PHP的指導是否安全? – David 2011-04-15 13:46:07

+0

是的,我的確在使用PHP。不過,也歡迎一般準則。 – check123 2011-04-15 14:36:45

+0

在這種情況下,我會引用你在這裏:http://stackoverflow.com/questions/1624846/php-best-practices-for-user-authentication-and-password-security – David 2011-04-15 15:17:29

回答

4

這不是最佳實踐。

  • 首先,它只會在用戶名和密碼未加密時才起作用。
  • 其次它對SQL注入是無可救藥的,並且我可以在大約3秒內用該SQL語句竊取所有的用戶證書。

這裏的最佳實踐開始:https://www.owasp.org/index.php/Guide_to_Authentication

你最好的辦法是使用你開發什麼環境中,而不是建立自己的,或現有的會員提供更好,但使用OpenID或類似的mehanism。

即使OWASP文章太深入,請至少閱讀:http://www.codinghorror.com/blog/2008/05/openid-does-the-world-really-need-yet-another-username-and-password.html

這:http://www.codinghorror.com/blog/2007/09/youre-probably-storing-passwords-incorrectly.html

最後一個編輯

這是文章中,我真的很期待因爲當我發現上面這兩個:http://www.codinghorror.com/blog/2010/12/the-dirty-truth-about-web-passwords.html

+0

但我做這個爲B2B網絡應用程序(如SAAS模式),因此我需要使用我自己的登錄管理。 – check123 2011-04-15 14:34:24

+0

這裏有幾個特定於PHO的答案:http://stackoverflow.com/questions/1624846/php-best-practices-for-user-authentication-and-password-security – David 2011-04-15 15:18:10

0

你可以這樣做...

SELECT `id`, `password` FROM `log_records` WHERE `username` = uname 

當然假設uname通過正確的轉義機制綁定或轉義。

如果沒有行,就會知道用戶不存在。

然後,您可以將用戶提交的密碼與該用戶的密碼進行比較。

然後,您可以在內部記錄此失敗登錄的詳細信息。

請記住,不要告訴最終用戶失敗。使用一些通用的,如用戶名和/或密碼組合不匹配

0

這是一個有效的方法。它不包含在你的文章中,但我認爲pass是實際密碼的加密版本?

以上聲明確實要求用戶名是唯一的,但通常是。

需要注意的是,上面的語句不必區分大小寫。一些數據庫比較文本格式而不是位格式的文本數據。這意味着使用密碼「MyPasSworD」登錄將可以工作,但是「mypassword」也可以。

+0

是的密碼是加密的。至於區分大小寫的事情,即使技術允許有餘地,我仍然堅持遵守命名慣例/標準。 :) – check123 2011-04-15 14:38:45

0

我使用這個僞代碼算法。

  • 開始 是否存在
  • 得到的用戶名的密碼,如果存在
  • 如果使用enryption
    • 的sanitize輸入
    • 檢查用戶名,加密輸入的密碼
    • 比較用戶名的密碼發送到該輸入密碼
    • 做一些東西
  • 結束