增加登录时间延迟以防止暴力破解,是个好主意吗?

14

我已经设置了数据库记录每次登录尝试失败的情况。我想将失败尝试的次数乘以0.05秒或其他时间。就像这样:

            time_nanosleep(0, (50000000 * $failed_attempts ) ); 

黑客尝试猜测密码的次数越多,每次检查所需的时间就越长。在检查100个密码后,他必须在每次尝试之间等待5秒。

这是防止暴力破解的好方法吗?我通过IP识别用户。所以我想你可以使用多个代理服务器之类的方式来进行暴力破解,但除此之外,我认为这是一个好主意。你们觉得呢?

8个回答

9

你觉得这样怎么样:

time_nanosleep(0, (10000000000 * (log($failed_attempts)^10)) ); 

这将为您提供一个指数级增长的尝试窗口。

你应该使用任意值而不是指数级增加时间。攻击者会忽略额外的时间,因为他意识到你每次失败尝试都在增加时间。这最终会耗费服务器一些资源,并且不提供任何其他安全保障。 - MaxVerro

5

我首先发现的问题是,你在处理的机器人并不在意回复之间是否有延迟。除非你采取措施限制此行为,否则你可能会使用大量系统资源,并出现潜在的非常长的延迟。在 5 次尝试失败后,只需禁止该 IP 即可。如果你担心禁止了真正的用户,可以采用临时禁令。


3
我不确定Friar确切的想法,但这让我有了一个有趣的想法。与其进行睡眠,为什么不在指数级增长的时间内拒绝用户呢?也就是说,在第一次失败后,来自该IP地址的任何进一步登录尝试都会被拒绝,比如在1秒钟内。下一次失败则在2秒钟后。等等。对于一个打错密码的人类用户,他可能甚至不会注意到:他需要花费几秒钟检查密码并重新输入。但对于机器人来说,它将遭受他可能不知道如何解释的失败。 - Jay

3

尽量不要使用Sleep(),因为它会占用CPU周期,如果你面临来自10,000个IP地址的暴力攻击,你将派生出10,000个sleep()子进程或线程,这会给你的服务器造成很大的负载。

相反地,你可以尝试使用PHP阻止IP地址。可以使用以下代码:

function block_ip($ip) {
    $deny = array("$ip");
    if (in_array ($_SERVER['REMOTE_ADDR'], $deny)) {
        header("HTTP/1.1 403 Forbidden");
        exit();
    }
}

3

这不应该是你对抗暴力破解的全部策略,但它是该策略的一个很好的组成部分,我认为几乎总是应该使用。


我并没有看到太多的好处——随着平均延迟的升高,攻击者会逐渐明白正在发生什么——但如果你觉得有吸引力,我也没有看到任何伤害。 - chaos
1
@chaos:那又怎样?重点不是要让攻击者感到惊讶,而是要减缓他的攻击速度。我们在城堡周围建造墙壁,使攻击者难以进入。攻击者看到这些墙壁并意识到它们是为了阻止他进入,并不会使它们变得不那么有效。 - Jay
你似乎在回应我没有提到的观点。我的评论是针对akond的回应。 - chaos

3

限制IP重试次数并使用验证码。不要过载服务器,保持简单。


1
是的,使用reCaptcha或其他类似的东西,你可以在x次失败尝试后让它出现。 - Phoenix
我不喜欢使用验证码,尤其是reCaptcha。对于设计和用户友好性来说都不好。 - ganjan

1
你可能想要将时间呈指数级增长而不是线性增长;或者将其固定,例如,在5次失败尝试后拒绝1小时。

0

我知道我在某个地方看过这样的做法,但我忘记了是在哪里。我看到的例子是,每次尝试失败后,将时间延迟加倍。如果你从0.1秒开始,一个普通用户可能会输错密码一两次,导致延迟增加到0.4秒。他们甚至不会注意到。但是,试图进行暴力攻击的人很快就会遇到几分钟或几小时的延迟。

我想对于Web应用程序来说,可能存在自己发起拒绝服务攻击的问题。这完全取决于系统如何处理时间延迟。


0

机器人并不在乎你的延迟,无论是指数还是对数或其他任何形式。你使用的任何延迟都可以通过轮询来克服。因此,不要考虑延迟。考虑限制尝试次数并使用Google reCAPTCHA。它使用公钥加密和私钥解密。适用于消除大多数机器人,并且更难破解。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接