登录验证算法

| 我知道一个-
SELECT * FROM log_records WHERE \'username\'=uname AND \'password\'=pass;
if(row_count==1)
    return true;
return false;  
问题是: 上面的算法是“最佳实践”吗? 以上算法有其他选择吗? 谢谢!     
已邀请:
那不是最佳实践。 首先,只有在用户名和密码未加密的情况下,它才起作用。 其次,它对SQL注入毫无希望,而且我可以使用该SQL语句在大约3秒钟内窃取所有用户凭据。 从此处开始以获取最佳实践:https://www.owasp.org/index.php/Guide_to_Authentication 最好的选择是将现有的成员资格提供程序用于您正在开发的任何环境,而不是使用OpenID或类似的机制来构建自己的或更好的环境。 即使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
当然,假定ѭ2是通过正确的转义机制绑定或逃逸的。 如果没有行,您将知道该用户不存在。 然后,您可以将用户提交的密码与该用户的密码进行比较。 然后,您可以在内部记录此失败登录的详细信息。 请记住,不要告诉最终用户哪个失败。使用通用名称,例如用户名和/或密码组合不匹配。     
这是一种有效的方法。它不包含在您的帖子中,但我认为该密码是实际密码的加密版本? 上面的声明确实要求用户名唯一,但通常是唯一的。 附带说明的是,以上陈述不必区分大小写。一些数据库以文本格式而不是位格式比较文本数据。这意味着可以使用密码“ MyPasSworD”登录,但也可以使用“ mypassword”登录。     
我正在使用此伪代码算法。 开始 清理输入 检查用户名是否存在 获取用户名的密码(如果存在) 如果使用加密,则对输入的密码进行加密 将用户名的密码与输入的密码进行比较 做一些事情 结束     

要回复问题请先登录注册