关闭。这个问题是基于意见的。它目前不接受答案。
**想改进这个问题吗?**更新这个问题,这样就可以通过编辑这篇文章用事实和引文来回答。
两年前关门了。
改进这个问题
选择一个用户名和密码都等于某个值的sql条目,而不是只选择用户名,然后使用php检查密码的有效性,这样做的好处是什么?
我知道使用以下方法是正确的:
(请不要介意sql可注入性和此伪代码中缺少哈希)
SELECT * FROM users WHERE username='Manfred' AND password='securepass'
而不是使用
SELECT * FROM users WHERE username='Manfred'
检查
if ($row['password'] == "securepass") {
//authenticated
}
在测试环境中,这两种方法对我都起到了预期的作用,但是我想知道我是否遗漏了一个重要的安全原因。
2条答案
按热度按时间anauzrmj1#
在php端使用compare语句允许您应用加密算法+将密码作为原始值存储在db中是不安全的。通常散列/加密散列存储在db中,当您获得$user+$pass对时,您将从db获得user,并检查该散列与应用于$pass的算法结果的匹配。
d6kp6zgx2#
第一种方法更简单,但并不比第二种更“正确”。这将取决于系统要求。
考虑以下要求:如果您的项目有审计要求,1)必须锁定一个帐户,如果密码失败超过x次(第一种方法需要至少一个update语句,不管帐户是否存在)2)当帐户登录失败时必须审核日志(如果是第一种方法,您甚至会记录那些不存在的帐户)
有些人可能会认为,在第一种方法中,应用程序层不接触存储的密码,但这并不意味着第二种方法不安全。如果应用层不可信,系统就有更大的问题。