PHP密码尝试阻止

时间:2011-11-03 13:27:35

标签: php

我想知道在用户提交5次错误登录尝试后处理阻止计算机的最佳方法。

我想通过IP做到这一点但后来我开始思考用户是通过网关来共享一个共同的IP。我不希望阻止有害用户,因为同一网络上的其他人输入的数据不正确。

Cookie是另一种选择,但用户可以从浏览器中清除它们,因此我认为它们效率很低。

其他人可以再给我一些想法吗?

谢谢Mic

2 个答案:

答案 0 :(得分:2)

您可以使用PEAR::HTTP_FloodControl

<?php
if ($login_not_successful) {
require_once 'HTTP/FloodControl.php';
try {
    $ip = HTTP_FloodControl::getUserIP();
} catch (HTTP_FloodControl_Exception $e) {
    die($e);
}
try {
    $fc =& new HTTP_FloodControl();
    $fc->setContainer('File', '/home/user1/logs');
    $limits = array (
        10   => 10,  // maximum 10 requests in 10 seconds
        60   => 30,  // maximum 30 requests in 60 seconds
        300  => 50,  // maximum 50 requests in 300 seconds
        3600 => 200  // maximum 200 requests in 3600 seconds
    );
    if (!$fc->check($limits, $ip)) {
        die('Too many requests. Please try later.');
    }
} catch (HTTP_FloodControl_Exception $e) {
    die($e);
}
}
// Your login form
?>

答案 1 :(得分:1)

我会做类似的事情:

如果用户提交5次错误的登录尝试:

  • 阻止用户登录15 [xxx]分钟(如果他也尝试密码是正确的,那么它将不起作用)

  • 添加验证码控件,以便其他用户可以毫无问题地登录...

我会通过IP和用户名...

来做到这一点

只需在数据库中保存上次错误尝试的时间戳,然后是错误尝试的增量值。

然后,如果他试图在确定的时间之前登记(让我们假设15分钟)从上次错误的尝试和

  • 增量值低于最大登录尝试次数,只需使用新时间戳更新增量值+ 1和时间戳

  • 增量值等于(或更高)您阻止登录尝试并使用新时间戳增加时间戳