2013-03-20 166 views
1

这个问题本质上是语言不可知的,但在我的情况下,我使用PHP为任何人想知道。记录失败的登录尝试

我想跟踪用户失败的登录尝试次数,以便在X失败尝试后显示CAPTCHA。唯一的办法就是防止暴力攻击。它不一定是一个非常安全的方式,只是令人讨厌,无法推迟那些蛮横的人。

我正在考虑创建会话变量$_SESSION['failedLoginAttempts'],并在每次检测到失败的登录尝试时增加它。攻击者仍然可以替换浏览器或者删除他的cookies来继续前进,但是这会使他(即他用来执行暴力的任何工具)每次尝试都浪费几秒钟的时间,因此尝试的次数会很高降低。

从一秒钟到一对夫妇的攻击每分钟将是理想的,那么攻击可以忽略不计。

这种方法是否正确或我错过了什么?另外,这些情况下的最佳做法是什么?

+0

他们可能会跳到不同的用户名。也许通过IP登录? – ethrbunny 2013-03-20 21:57:31

回答

3

您最好将其记录在附加到用户标识的数据库中。这是因为一个坚定的攻击者不会使用网络浏览器进行暴力破解;用大多数任何语言构建脚本都非常简单,它会重复登录尝试并完全忽略cookie,或者在每次尝试后重置cookie。

+1

这是真的......但不会每次重置Cookie都会花费足够的时间(甚至可能不到一秒)来阻止攻击? 如果不是这样,那么记录攻击者的IP可能会更有效,并且阻止任何来自该IP的登录尝试几个小时 – federicot 2013-03-20 22:05:22

+1

如果他们使用自定义脚本,重置Cookie所需的数量可以忽略不计时间(微秒)。您可以通过IP或用户名跟踪,但用户名可能更有效。例如,我的办公室大约有三百人在一个外部IP地址后面。因此,通过IP进行锁定会产生很多误报,其中同一IP登录后的两个人同时登录会出现攻击。 – Adrian 2013-03-21 13:46:15

+1

谢谢你的回答!是的,你可能是对的。只要防御措施不会阻止帐户(因此妨碍实际所有者访问它),但是像验证码一样,使用用户名跟踪是最有效的方法。 – federicot 2013-03-22 02:15:44

0

另外请记住,如果您在数据库中存储加密的密码。

PHP或MySQL应该接受用户输入并加密。

例如(不是真实的,而不是安全的代码)

$query = "SELECT * FROM user WHERE user = " . $_POST['username'] . " AND password " . sha512($_POST['password']); 

如果你的服务器最多可能需要在post请求8点MB的数据。该攻击者可以将1 Mb作为密码发布,试图对DDOS进行加密以保持服务器的CPU处于高负载状态。

+0

你不应该做'password ='。sha512($ _ POST ['password'])'',而是从表中选择密码,其中username = $ _POST ['username']',显然会首先清理用户输入。然后比较数据库中的内容与运行任何必要加密的密码字段中发布的内容。如果在LAMP设置中,您还应该有软件防火墙和mod_security。 mod_security通常有助于处理大量的后期数据攻击,而防火墙可能是针对DDoS的一个很好的解决方案。尽管如此,我觉得这个答案与OP的问题无关。 – Piero 2015-04-29 14:47:32