选择一个SQL条目(用户名和密码都等于特定值)而不是仅按用户名选择,然后再使用PHP检查密码有效性的好处是什么?
我知道使用它被认为是正确的:
(请不要介意SQL的可注入性以及此伪代码中缺少散列)
SELECT * FROM users WHERE username='Manfred' AND password='securepass'
代替使用
SELECT * FROM users WHERE username='Manfred'
并检查
if ($row['password'] == "securepass") {
//authenticated
}
这两种方法都可以在测试环境中按预期工作,但是我想知道我是否缺少相当大的安全原因。
答案 0 :(得分:2)
第一种方法比第二种方法更简单,但“正确性”却不高。这取决于系统要求。
考虑以下要求: 如果您的项目有审核要求, 1)如果密码失败超过X次,必须锁定帐户; (第一种方法将至少需要一条更新语句,而不管帐户是否存在) 2)必须在帐户登录失败时审核日志(如果采用第一种方法,您甚至会记录那些不存在的帐户)
有人可能会争辩说,在第一种方法中,应用程序层不会触摸存储的密码,但这并不意味着第二种方法并不安全。如果无法信任应用程序层,则系统存在更大的问题。
答案 1 :(得分:0)
在php端使用compare语句可让您应用密码算法,而且将密码作为原始值存储在DB中并不安全。通常,哈希/加密哈希存储在数据库中,当您获得对$ user + $ pass时,就会从数据库中获取用户,并检查该哈希与将算法应用于$ pass的结果是否匹配。