PHP & MySQL 比较密码

标签 php mysql authentication passwords

如何检查用户是否输入了正确的登录密码?

这就是我正在做的(从一堆组合中……):

<?

$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/

相关文章:

php - 在 PHP 中处理大型 JSON 文件

php - MYSQL三元数据库选择

MySQL查询问题

javascript - 最好的开源JavaScript Open ID选择器是什么?

iphone - 如何在登录 Iphone App 后重定向到主页选项卡?

php - 如何在 php 中获取 POST 的正文?

php - 如何使用选项运行在 composer.json 中创建的自定义命令?

mysql - inner join 一张表中的两个外键

php - 在数据库中使用 PHP 变量

security - Multi-Tenancy Azure AD 非管理员登录