【问题标题】:PHP Password Attempts BlockingPHP密码尝试阻止
【发布时间】:2011-11-03 21:37:20
【问题描述】:

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

我本来想通过 IP 来实现,但后来我开始考虑如果用户通过网关进入并共享一个公共 IP 会怎样。我不想阻止合法用户,因为同一网络上的其他人正在输入不正确的数据。

Cookie 是另一种选择,但用户可以从浏览器中清除它们,所以我认为它们会非常无效。

还有其他人可以给我更多关于这个的想法吗?

感谢麦克风

【问题讨论】:

  • 也许只是减慢他们的速度(指数?):例如第一次等待 1 秒,第二次等待 2 秒,第三次等待 4 秒,第四次等待 8 秒,第五次等待 16 秒,第六次等待 32 秒,第七次等待 64 秒,以此类推
  • 成功时不要忘记将上面的内容重置为 0。否则,您健忘的用户最终将面临巨大的失败等待。这很有趣,但对用户不友好。

标签: php


【解决方案1】:

你可以使用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
?>

【讨论】:

  • 正如已经指出的那样,基于 IP 的解决方案是弱的,不会保护任何东西
  • 我更喜欢使用非 PEAR 解决方案,但用于输入。我会看看这个以备将来使用
【解决方案2】:

我会这样做:

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

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

  • 添加验证码控件,让其他用户可以顺利登录...

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

只需将上次错误尝试的时间戳和错误尝试的增量值保存在数据库中。

那么,如果他在上次错误尝试后的确定时间(假设 15 分钟)之前尝试登录,并且

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

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

【讨论】:

  • 这个方法有问题。如果我尝试将帐户连接到 您的 帐户 5 次但失败,则 无法连接到您的帐户。
  • @Luc 但无论如何这是唯一可靠的方法。尽管使用好的密码,超时可能非常小,比如几秒钟。
  • 我认为这种方法是我在项目时间限制下能做的最好的解决方案。
猜你喜欢
  • 1970-01-01
  • 2015-08-26
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 2015-09-07
  • 2016-01-26
  • 1970-01-01
相关资源
最近更新 更多