与仅在PHP中选择用户名和检查密码相比,选择用户名和密码正确的条目的优势?

时间:2018-12-24 21:18:12

标签: php mysql authentication

选择一个SQL条目(用户名和密码都等于特定值)而不是仅按用户名选择,然后再使用PHP检查密码有效性的好处是什么?

我知道使用它被认为是正确的:

(请不要介意SQL的可注入性以及此伪代码中缺少散列)

SELECT * FROM users WHERE username='Manfred' AND password='securepass'

代替使用

SELECT * FROM users WHERE username='Manfred'

并检查

if ($row['password'] == "securepass") {
    //authenticated
}

这两种方法都可以在测试环境中按预期工作,但是我想知道我是否缺少相当大的安全原因。

2 个答案:

答案 0 :(得分:2)

第一种方法比第二种方法更简单,但“正确性”却不高。这取决于系统要求。

考虑以下要求: 如果您的项目有审核要求, 1)如果密码失败超过X次,必须锁定帐户; (第一种方法将至少需要一条更新语句,而不管帐户是否存在) 2)必须在帐户登录失败时审核日志(如果采用第一种方法,您甚至会记录那些不存在的帐户)

有人可能会争辩说,在第一种方法中,应用程序层不会触摸存储的密码,但这并不意味着第二种方法并不安全。如果无法信任应用程序层,则系统存在更大的问题。

答案 1 :(得分:0)

在php端使用compare语句可让您应用密码算法,而且将密码作为原始值存储在DB中并不安全。通常,哈希/加密哈希存储在数据库中,当您获得对$ user + $ pass时,就会从数据库中获取用户,并检查该哈希与将算法应用于$ pass的结果是否匹配。