Ну, я сделал скрипт для обработки его только для запросов ядра (без запросов сеанса или других запросов, которые не вызывают ядро).Если вы заглянете в Google, вы найдете скрипты / классы, которые будут убивать ваш сервер из-за высокой нагрузки каждый раз.Тот факт, что многие используют SESSIONs и, возможно, ТАКЖЕ SQL / Database, позволит вам получить защиту от наводнений как убийца сервера.Также тот факт, что сессиям нужен Cookie (или GET SID), чтобы вы могли легко управлять SESSION, чтобы получить новый идентификатор SESSION.
Моя функция основана на тексте и выполняет простую обработку.Плохо то, что вам, возможно, придется использовать CronJob, чтобы время от времени удалять ips.По сравнению с другими сценариями он примерно на 10 * быстрее (и экономит больше, чем сеансы).
Я не знаю, действительно ли он вообще полезен.;) Возможно, вы захотите изменить значение об / мин на меньшее или / и также 200 req.Моя настройка - запрет для бота, выполняющего интервальные запросы в течение <= 6 секунд. </p>
<?php
function ht_request_limiter() {
if (!isset($_SERVER['REMOTE_ADDR'])) { return; } // Maybe its impossible, however we check it first
if (empty($_SERVER['REMOTE_ADDR'])) { return; } // Maybe its impossible, however we check it first
$path = '/your/path/ipsec/'; // I use a function to validate a path first and return if false...
$path = $path.$_SERVER['REMOTE_ADDR'].'.txt'; // Real file path (filename = <ip>.txt)
$now = time(); // Current timestamp
if (!file_exists($path)) { // If first request or new request after 1 hour / 24 hour ban, new file with <timestamp>|<counter>
if ($handle = fopen($path, 'w+')) {
if (fwrite($handle, $now.'|0')) { chmod($path, 0700); } // Chmod to prevent access via web
fclose($handle);
}
}
else if (($content = file_get_contents($path)) !== false) { // Load existing file
$content = explode('|',$content); // Create paraset [0] -> timestamp [1] -> counter
$diff = (int)$now-(int)$content[0]; // Time difference in seconds from first request to now
if ($content[1] == 'ban') { // If [1] = ban we check if it was less than 24 hours and die if so
if ($diff>86400) { unlink($path); } // 24 hours in seconds.. if more delete ip file
else {
header("HTTP/1.1 503 Service Unavailable");
exit("Your IP is banned for 24 hours, because of too many requests.");
}
}
else if ($diff>3600) { unlink($path); } // If first request was more than 1 hour, new ip file
else {
$current = ((int)$content[1])+1; // Counter + 1
if ($current>200) { // We check rpm (request per minute) after 200 request to get a good ~value
$rpm = ($current/($diff/60));
if ($rpm>10) { // If there was more than 10 rpm -> ban (if you have a request all 5 secs. you will be banned after ~17 minutes)
if ($handle = fopen($path, 'w+')) {
fwrite($handle, $content[0].'|ban');
fclose($handle);
// Maybe you like to log the ip once -> die after next request
}
return;
}
}
if ($handle = fopen($path, 'w+')) { // else write counter
fwrite($handle, $content[0].'|'.$current .'');
fclose($handle);
}
}
}
}
Редактировать: Мой способ проверить время запроса был с помощью microtime и моделировать 10'000 пользователей.Спрашиваю гугл и проверял (как пример) http://technitip.net/simple-php-flood-protection-class
Так я не знаю, что там должно быть просто?У вас есть около 3 SQL-запросов одновременно, например:
$this -> user_in_db($ip))
$this->user_flooding($ip);
$this->remove_old_users();
Возможно, они предоставляют больше функций, но все законные пользователи используют серверное время даром.;)