密码验证

时间:2010-03-25 05:32:53

标签: php mysql passwords

使用mysql和php

在检查密码时是否有任何原因/值使用用户名和密码查询数据库(当然,在清理之后)并且在没有返回任何行时记录失败的尝试,而不是使用用户名查询数据库然后比较返回密码字符串?

编辑:对于那些在下面提到它的人,是的,密码会在数据库中被删除。

5 个答案:

答案 0 :(得分:4)

如果我理解正确,你会想知道比较结果之间是否存在差异:

$results = mysql_query("SELECT name FROM users WHERE name = $properlyEscapedName AND pass = $properlyEscapedPassword");
if (mysql_num_rows($result) == 1)
    $authenticated = true;

$results = mysql_query("SELECT name, pass FROM users WHERE name = $properlyEscapedName");
$array = mysql_fetch_assoc($results);
if ($array["pass"] == $unescapedPass)
    $authenticated = true;

我会注意到,出于安全原因,最好存储密码哈希而不是明文密码,但是我看到的唯一区别是,在第一种情况下,您将返回少一个字段,这可能意味着更有效地使用您之间的带宽服务器和数据库。另一方面,您的查询大了几个字节,因此可能会减少较小结果集的小优势。

答案 1 :(得分:1)

我在这里看到2个问题。

  1. 检查数据库的任何信息的一般方法是使数据库执行此操作。因此,将登录名和密码都放入查询中。特别是如果我们存储哈希,而不是密码本身
  2. 密码猜测保护是任何授权系统的重要补充。

答案 2 :(得分:1)

您需要在提供给用户的信息和防止攻击之间进行权衡。

如果查询数据库检查相应的登录名和密码并且失败,则只能告诉用户登录名或密码是错误的。如果他不记得您曾经注册过哪个登录信息(无论是“Arkh01”,“arkh”还是“Arkh1”),就无济于事。

如果您在数据库中查询登录信息,那么获取哈希和盐可以告诉用户登录是否错误或密码。用户很高兴。但攻击您网站的人可以轻易地了解用户“aa”不存在,但用户“ab”却存在。由于很多网站都提供了访问用户列表的权限,因此您几乎总能忽略这一问题。

要防止暴力破解,请记录IP或登录尝试的次数,并在出现5次错误后阻止任何进一步的尝试。最好阻止使用的IP,而不是帐户。

关于存储哈希密码,在php中使用盐和hmac + sha512:hash_hmac

答案 3 :(得分:0)

这两种方法基本没有区别。如果密码与名称不匹配,这两种方法都会通知您。

答案 4 :(得分:0)

您执行的工作越多/登录尝试失败后保持打开连接的时间越长,您就越容易受到DOS攻击。 OTOH你需要平衡这个以防止暴力搜索。

更智能的解决方案是在加密的cookie中推送失败的尝试客户端数量(在用户到达登录页面之前删除cookie - 如果他们尝试发布没有cookie的用户名和密码 - 自动失败 - 带有必须启用cookie的消息)。在连续3次失败尝试失败后,如果登录失败,则增加故障并重新加密以丢弃新cookie。

它并不能完全阻止蛮力攻击,但却使它们变得更加困难。

下进行。