unetway/rate-limiting

Скрипт подсчитывает действия пользователя и блокирует его при превышении лимита.

v1.0.1 2024-05-18 11:50 UTC

This package is auto-updated.

Last update: 2024-09-18 12:54:32 UTC


README

PHP-скрипт для защиты от парсинга и ботов. Скрипт позволяет произвести подсчет количества действий или запросов пользователя и заблокировать его на определенное время при достижении заданного количества.

Например, если пользователь больше 5 раз входил на страницу, то вы можете вывести ему сообщение, либо заблокировать доступ на страницу в течении 24 часов.

Проверка осуществляется по IP пользователя (дополнительно можно включить проверку по user-agent).

Требования

На вашем сервере должны быть установлено:

  • Redis >=3
  • PHP >=7.0

Установка

Для установке просто скопируйте файл RateLimitingService.php в нужный вам каталог, при необхоимости добавьте namespace или переименуйте класс.

Количество действий пользователя хранится к Redis, поэтому убедитесь, что он установлен на вашем сервере или компьютере.

Использование

Проверка осуществляется по IP пользователя (дополнительно можно включить проверку по user-agent).

Параметры, которые можно передать в класс:

  • host, адрес подключения к Redis (по умолчанию, localhost).
  • maxCallsLimit, количество действий (по умолчанию, 5 попыток).
  • timePeriod, время блокировки в секундах (по умолчанию, 86400 - 24 часа).
  • userAgent, дополнительно проверять по параметру user-agent браузера пользователя.

Пример 1

Если пользователь посетил страницу больше 10 раз, то отдаем странице код 429 и блокируем дальнейшие действия пользователя на 24 часов.

$rateLimit = new RateLimitingService([
  'maxCallsLimit' => 10,
  'timePeriod' => 86400
]);

if (!$rateLimit->check()) {
  http_response_code(429);
  exit();
}

Пример 2

Блокируем действия пользователя и показываем сколько раз он совершил действие.

$rateLimit = new RateLimitingService([
  'maxCallsLimit' => 10,
  'timePeriod' => 86400
]);

if (!$rateLimit->check()) {
  echo "Вы уже отправили форму ${$rateLimit->total()} раз!";
}