我知道的人 -登錄驗證算法
SELECT * FROM log_records WHERE 'username'=uname AND 'password'=pass;
if(row_count==1)
return true;
return false;
的問題是:
- 是上述算法一個 '最佳實踐'?
- 是否有任何替代上述算法?
謝謝!
我知道的人 -登錄驗證算法
SELECT * FROM log_records WHERE 'username'=uname AND 'password'=pass;
if(row_count==1)
return true;
return false;
的問題是:
謝謝!
這不是最佳實踐。
這裏的最佳實踐開始: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
你可以這樣做...
SELECT `id`, `password` FROM `log_records` WHERE `username` = uname
當然假設uname
通過正確的轉義機制綁定或轉義。
如果沒有行,就會知道用戶不存在。
然後,您可以將用戶提交的密碼與該用戶的密碼進行比較。
然後,您可以在內部記錄此失敗登錄的詳細信息。
請記住,不要告訴最終用戶失敗。使用一些通用的,如用戶名和/或密碼組合不匹配。
這是一個有效的方法。它不包含在你的文章中,但我認爲pass是實際密碼的加密版本?
以上聲明確實要求用戶名是唯一的,但通常是。
需要注意的是,上面的語句不必區分大小寫。一些數據庫比較文本格式而不是位格式的文本數據。這意味着使用密碼「MyPasSworD」登錄將可以工作,但是「mypassword」也可以。
是的密碼是加密的。至於區分大小寫的事情,即使技術允許有餘地,我仍然堅持遵守命名慣例/標準。 :) – check123 2011-04-15 14:38:45
我使用這個僞代碼算法。
順便說一句,什麼平臺你在開發?如果您在環境中標記問題,您可能會得到更具體的指導,因爲許多平臺已經提供了認證/成員身份機制。你的大部分問題似乎都與PHP有關......假設你正在尋找特定於PHP的指導是否安全? – David 2011-04-15 13:46:07
是的,我的確在使用PHP。不過,也歡迎一般準則。 – check123 2011-04-15 14:36:45
在這種情況下,我會引用你在這裏:http://stackoverflow.com/questions/1624846/php-best-practices-for-user-authentication-and-password-security – David 2011-04-15 15:17:29