如何检查用户是否输入了正确的登录密码?
这就是我正在做的(从一堆组合中……):
<?
$login = $_POST['login'];
$password = $_POST['password'];
mysql_connect('localhost', 'root', 'abc123');
mysql_select_db('aun_vox') or die(mysql_error());
$q = mysql_query("SELECT password FROM customer WHERE login='$login'");
$db_pass = mysql_result($q, 0);
if(md5($password) == $db_pass)
{
echo "You did it.";
}
else echo "Wrong.";
?>
正如我从输出中看到的,mysql_result
位有问题,但我想不出正确的方法。
有人可以帮忙吗
最佳答案
我看到您在数据库中存储密码的散列,但为了其他读者的利益,永远不要在数据库中以明文形式存储密码。你不想成为 like Monster.com.uk !
您应该使用比MD5()
更强的散列函数。理想情况下,您应该使用 SHA256。使用 hash()
可以在 PHP 中使用此哈希方法。功能。
您还应该随机应用一个 salt到密码。为每个用户的帐户存储不同的盐值。这有助于击败字典攻击和 rainbow table攻击。
你应该学会使用 mysqli扩展而不是旧的 mysql 扩展。 Mysqli 支持参数化查询,因此可以减少一些 SQL 注入(inject)攻击的漏洞。
这是一些示例代码。我还没有测试过它,但它应该非常接近工作:
$input_login = $_POST['login'];
$input_password = $_POST['password'];
$stmt = $mysqli->prepare("SELECT password, salt FROM customer WHERE login = ?");
$stmt->bind_param("s", $input_login);
$stmt->execute();
$stmt->bind_result($password_hash, $salt);
while ($stmt->fetch()) {
$input_password_hash = hash('sha256', $input_password . $salt);
if ($input_password_hash == $password_hash) {
return true;
}
// You may want to log failed password attempts here,
// for security auditing or to lock an account with
// too many attempts within a short time.
}
$stmt->close();
// No rows matched $input_login, or else password did not match
return false;
其他一些人建议查询应该测试 login = ? AND password = ?
但我不喜欢这样做。如果这样做,您将不知道查找失败是因为登录名不存在,还是因为用户提供了错误的密码。
当然,您不应该向用户透露导致登录尝试失败的原因,但您可能需要知道,以便记录可疑事件。
@Javier 在他的回答中说您不应该从数据库中检索密码(在本例中为密码哈希)。我不同意。
Javier 展示了在 PHP 代码中调用 md5()
并将生成的哈希字符串发送到数据库。但这不支持轻松加盐密码。在您可以在 PHP 中进行散列之前,您必须执行单独的查询来检索此用户的盐。
另一种方法是通过网络将 纯文本 密码从您的 PHP 应用程序发送到您的数据库服务器。窃听您网络的任何人都可以看到此密码。如果您记录了 SQL 查询,任何有权访问日志的人都可以看到密码。有动机的黑客甚至可以在垃圾箱中查找旧的文件系统备份介质,并可能以这种方式读取日志文件!
风险较小的方法是从数据库中获取密码哈希字符串到 PHP 应用程序中,将其与用户输入的哈希值(也在 PHP 代码中)进行比较,然后丢弃这些变量。
关于PHP & MySQL 比较密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/488804/