我知道的人 -登录验证算法
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