在php中选择用户名和密码正确的条目比只选择用户名和检查密码的优势?

zour9fqk  于 2021-06-15  发布在  Mysql
关注(0)|答案(2)|浏览(459)

关闭。这个问题是基于意见的。它目前不接受答案。
**想改进这个问题吗?**更新这个问题,这样就可以通过编辑这篇文章用事实和引文来回答。

两年前关门了。
改进这个问题
选择一个用户名和密码都等于某个值的sql条目,而不是只选择用户名,然后使用php检查密码的有效性,这样做的好处是什么?
我知道使用以下方法是正确的:
(请不要介意sql可注入性和此伪代码中缺少哈希)

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

而不是使用

SELECT * FROM users WHERE username='Manfred'

检查

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

在测试环境中,这两种方法对我都起到了预期的作用,但是我想知道我是否遗漏了一个重要的安全原因。

anauzrmj

anauzrmj1#

在php端使用compare语句允许您应用加密算法+将密码作为原始值存储在db中是不安全的。通常散列/加密散列存储在db中,当您获得$user+$pass对时,您将从db获得user,并检查该散列与应用于$pass的算法结果的匹配。

d6kp6zgx

d6kp6zgx2#

第一种方法更简单,但并不比第二种更“正确”。这将取决于系统要求。
考虑以下要求:如果您的项目有审计要求,1)必须锁定一个帐户,如果密码失败超过x次(第一种方法需要至少一个update语句,不管帐户是否存在)2)当帐户登录失败时必须审核日志(如果是第一种方法,您甚至会记录那些不存在的帐户)
有些人可能会认为,在第一种方法中,应用程序层不接触存储的密码,但这并不意味着第二种方法不安全。如果应用层不可信,系统就有更大的问题。

相关问题