使用mysql和php
在检查密码时是否有任何原因/值使用用户名和密码查询数据库(当然,在清理之后)并且在没有返回任何行时记录失败的尝试,而不是使用用户名查询数据库然后比较返回密码字符串?
编辑:对于那些在下面提到它的人,是的,密码会在数据库中被删除。
答案 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个问题。
答案 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。
它并不能完全阻止蛮力攻击,但却使它们变得更加困难。
下进行。