Ну, я сделал сценарий для обработки его только для основных запросов (без запросов на сеанс или других запросов, которые не называют ядро). Если вы посмотрите на google, вы найдете скрипты/классы, которые будут убивать ваш сервер из-за больших нагрузок каждый раз. Тот факт, что многие используют СЕССИИ и, возможно, ТАКЖЕ SQL/Database, позволит вам получить защиту от наводнений в качестве сервера-убийцы. Также тот факт, что SESSIONs нужен Cookie (или GET SID), чтобы вы могли легко управлять SESSIONs, чтобы получить новый идентификатор SESSION.
Моя функция основана на тексте и делает простое управление. Плохо то, что вам, возможно, придется использовать CronJob для удаления ips время от времени. По сравнению с другими сценариями он примерно на 10 * быстрее (и больше, чем сеансы).
Я не знаю, действительно ли это действительно полезно. ;) Возможно, вам захочется изменить значение rpm на меньшее или /, а также на 200 req. Моя настройка - запрет на выполнение интервальных запросов ботом в < = 6 секунд.
<?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 пользователей. Я спрашиваю у Google и проверял (как пример) http://technitip.net/simple-php-flood-protection-class
Так что я не знаю, что должно быть там просто? У вас есть около 3 запросов SQL на один раз, как:
$this -> user_in_db($ip))
$this->user_flooding($ip);
$this->remove_old_users();
Это возможно поставить больше функций, но все законные пользователи используют ServerTime впустую. ;)
Спам-бот не будет распознавать cookie сеанса, поэтому, возможно, вообще не будет использовать сеанс. Он также может злонамеренно изменять идентификатор сеанса каждый раз, оставляя вас без возможности отслеживать его. Вероятно, вы не сможете обойти какой-либо IP-журнал. –
Заставить пользователя войти в систему, чтобы отправить сообщение? (только принимайте 'like.php's' из подписанных учетных записей). Затем запретите пользователям отправлять слишком много за определенное время? – Wallter
Спасибо за ваши предложения. Как я уже сказал в ответе на комментарии, мне действительно не хотелось бы, чтобы пользовательская система была главной точкой сайта - она должна быть быстрой и без проблем. Мне нужно будет зайти в журнал IP-адресов :) –