Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Cara membatasi upaya login - PHP &MySQL &CodeIgniter

Saya menerapkan mekanisme pelambatan orang miskin di phunction menggunakan APC saja, ini cara saya menggunakannya:

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

Saya menggunakan ini di Front-Controller saya dan meneruskan nilainya ke metode perutean saya, tapi itu cerita lain.

Intinya adalah jika Anda menggunakan APC, Anda dapat menyimpan semuanya dengan sangat cepat di memori dan dengan sedikit konsumsi memori karena APC mengikuti metodologi FILO. Jika Anda membutuhkan waktu tunggu yang jauh lebih tinggi, Anda dapat mempertimbangkan untuk menggunakan sesuatu yang bukan berbasis memori.

BTW:MySQL mendukung tabel dengan mesin MEMORY.

Masalah dengan sleep() :

Server web Apache khas dengan PHP yang diinstal sebagai modul akan memakan sekitar 10 MB RAM per instance, untuk menghindari melebihi ram yang tersedia, ada beberapa pengaturan Apache yang dapat Anda konfigurasikan untuk membatasi jumlah maksimum instance yang dapat dijalankan Apache.

Masalahnya adalah ketika Anda sleep() , instance tersebut masih aktif dan dengan permintaan yang cukup dapat menghabiskan semua slot yang tersedia untuk memulai server baru, sehingga membuat situs web Anda tidak dapat diakses hingga beberapa permintaan yang tertunda diselesaikan.

Tidak ada cara untuk mengatasinya dari PHP AFAIK, jadi pada akhirnya terserah Anda.

Prinsipnya sama untuk pelambatan sistem secara luas:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengapa begitu lama untuk mengganti nama kolom di mysql?

  2. kesalahan sintaks untuk deklarasi variabel mysql

  3. Memasukkan objek datetime.datetime Python ke MySQL

  4. Cara membuat MySQL menangani UTF-8 dengan benar

  5. PDO Sisipkan Array Menggunakan Kunci Sebagai Nama Kolom