Задать вопрос
zkrvndm
@zkrvndm
Архитектор решений

Как ограничить частоту запросов с одного IP адреса?

Подскажите, пожалуйста, существует ли какой-нибудь простой способ ограничить частоту частоту запросов с одного IP-адреса в конкретном php-обработчике? Без использования базы данных. Например, если кто-то долбит чаще, чем раз в секунду, то хотелось бы отдавать ему код состояния 429 или вовсе фейковый 503.
  • Вопрос задан
  • 85 просмотров
Подписаться 1 Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 1
@YakushinIlya
Если без БД то файловая система остается.
Например, при заходе посетителя создаем файл с именем его IP и записываем туда time():
// Открываем файл, флаг W означает - файл открыт на запись
$f_hdl = fopen($_SERVER['REMOTE_ADDR'].".txt", 'w');
// Записываем в файл $text
fwrite($f_hdl, time());
// Закрывает открытый файл
fclose($f_hdl);


При следующем заходе можно открыть файл если он существует и проверить содержимое, например так:
if($time=file_get_contents($_SERVER['REMOTE_ADDR'].".txt",)) {
// в переменную $time будет записано time() с предыдущего захода. 
// проверяем промежуток между заходами
$result = time() - $time;
// в переменную $result записано промежуточное время между заходами в миллисекундах
}


Далее просто остается определить достаточное это время для того чтоб блокировать вход или нет.
Например:
// Переменная $myTime содержит время через которое можно его пускать еще раз
$myTime = 600; 
$result = 60;

if($myTime > $result) {
header("HTTP/1.1 503");
exit();
}


Выше условие, если он зашел чаще чем дозволено в миллисекундах то выдается заголовок с кодом 503 и дальше останавливается выполнение скрипта.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы