Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como limitar as tentativas de login - PHP &MySQL &CodeIgniter


Implementei um mecanismo de estrangulamento do pobre em phunction usando APC sozinho, é assim que eu uso:
// 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));
}

Eu uso isso no meu Front-Controller e passo o valor para o meu método de roteamento, mas isso é outra história.

A conclusão é que, se você usar o APC, poderá manter as coisas muito rápidas na memória e com pouco consumo de memória, porque o APC segue uma metodologia FILO. Se você precisar de tempos limite muito maiores, considere usar algo que não seja baseado em memória.

BTW:MySQL suporta tabelas com o mecanismo MEMORY.

O problema com sleep() :

Um servidor web Apache típico com PHP instalado como um módulo consumirá cerca de 10 MB de RAM por instância, para evitar exceder sua memória RAM disponível, existem algumas configurações do Apache que você pode configurar para limitar o número máximo de instâncias que o Apache pode iniciar.

O problema é quando você sleep() , essa instância ainda está ativa e com solicitações suficientes pode acabar consumindo todos os slots disponíveis para iniciar novos servidores, tornando seu site inacessível até que algumas solicitações pendentes sejam concluídas.

Não há como superar isso do PHP AFAIK, então no final depende de você.

O princípio é o mesmo para o estrangulamento de todo o sistema:
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;
}