sql >> Databasteknik >  >> RDS >> Mysql

Hur man stryper inloggningsförsök - PHP &MySQL &CodeIgniter

Jag implementerade en fattigmansgasmekanism i phunction med enbart APC, så här använder jag det:

// 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));
}

Jag använder detta på min Front-Controller och skickar värdet till min routingmetod, men det är en annan historia.

Summan av kardemumman är att om du använder APC kan du hålla saker mycket snabbt i minnet och med liten minnesförbrukning eftersom APC följer en FILO-metod. Om du behöver mycket högre timeouts kan du överväga att använda något som dock inte är minnesbaserat.

BTW:MySQL stöder tabeller med MEMORY-motorn.

Problemet med sleep() :

En typisk Apache-webbserver med PHP installerad som en modul kommer att äta cirka 10 MB RAM per instans, för att undvika att överskrida din tillgängliga ram finns det några Apache-inställningar som du kan konfigurera för att begränsa det maximala antalet instanser som Apache kan starta.

Problemet är när du sleep() , den instansen är fortfarande aktiv och med tillräckligt många förfrågningar kan det sluta med att alla tillgängliga platser försvinner för att starta nya servrar, vilket gör din webbplats otillgänglig tills några väntande förfrågningar har slutförts.

Det finns inget sätt att övervinna detta från PHP AFAIK, så i slutändan är det upp till dig.

Principen är densamma för systemomfattande strypning:

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;
}


  1. Oracle XML :Hoppa över Finns inte nod

  2. Konvertera 'datetime' till 'datetime2' i SQL Server (T-SQL-exempel)

  3. Räkna upp rader i mysql baserat på grupper

  4. ATAN2() Funktion i Oracle