如何限制登录尝试 - PHP&MySQL和CodeIgniter

RS7*_*RS7 7 php mysql security throttling login

我希望能够根据失败的尝试来限制登录尝试,但我有一些问题.

我应该使用MySQL吗?(请注意,它可能会导致数据库紧张)
我应该为每个用户和系统范围或仅在系统范围内进行限制吗?(这样可以阻止普通人猜测密码)
我应该如何计算我的门槛?(因此它会自动适应变化/增长)
我应该如何检索此阈值?查询/计算缓存中的每个失败或存储?
我应该用什么节流?(读取睡眠()可能最终导致服务器紧张的响应)

有没有人有一些示例代码?

我是新手,所以我很感激你的帮助!谢谢

Ali*_*xel 6

我实现了一个人差的限制的机制phunction单独使用APC,这是我如何使用它:

// allow 60 requests every 30 seconds
// each request counts as 1 (expensive operations can use higher values)
// keep track of IPs by REMOTE_ADDR (ignore others)

$throttle = ph()->Throttle($ttl = 30, $exit = 60, $count = 1, $proxy = false);

if ($throttle === true)
{
    // IP exceded 30 requests in the last 60 seconds, die() here
}

else
{
    // $throttle is a float
    // number of requests in the last 30 seconds / 30 seconds

    /*
     1 req / 30 = 0,033 sec
     5 req / 30 = 0,166 sec
    10 req / 30 = 0,333 sec
    15 req / 30 = 0,5   sec
    20 req / 30 = 0,666 sec
    25 req / 30 = 0,833 sec
    30 req / 30 = 1     sec
    */

    usleep(intval(floatval($throttle) * 1000000));
}
Run Code Online (Sandbox Code Playgroud)

我在我的Front-Controller上使用它并将值传递给我的路由方法,但这是另一个故事.

最重要的是,如果你使用APC,你可以在内存中保持非常快的速度并且几乎没有内存消耗,因为APC遵循FILO方法.如果你需要更高的超时时间,你可以考虑使用不是基于内存的东西.

BTW:MySQL支持带MEMORY引擎的表.


问题sleep():

安装了PHP作为模块的典型Apache Web服务器每个实例将占用大约10 MB的RAM,为了避免超出可用的ram,可以配置一些Apache设置来限制Apache能够启动的最大实例数.

问题是,当您sleep(),该实例仍然处于活动状态并且有足够的请求可能最终会占用所有可用的插槽来启动新服务器,从而导致您的网站无法访问,直到某些待处理的请求完成为止.

没有办法从PHP AFAIK中克服这一点,所以最终取决于你.


系统范围限制的原则是相同的:

function systemWide($ttl = 86400, $exit = 360)
{
    if (extension_loaded('apc') === true)
    {
        $key = array(__FUNCTION__);

        if (apc_exists(__FUNCTION__) !== true)
        {
            apc_store(__FUNCTION__, 0, $ttl);
        }

        $result = apc_inc(__FUNCTION__, 1);

        if ($result < $exit)
        {
            return ($result / $ttl);
        }

        return true;
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

  • 这个问题就是即使你没有在1秒的睡眠时间内占用CPU时间,你仍然需要花费很长时间才能完成PHP过程.并且大多数前端服务器会迅速退化以降低整个服务器的速度(类似于slashdot效果,但只有一个用户而不是吨)... (2认同)