2011-04-15 66 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输入
    • 检查用户名,加密输入的密码
    • 比较用户名的密码发送到该输入密码
    • 做一些东西
  • 结束