/redis-banlist

Модуль формирования черных списков IP на основе Redis и PHP

Primary LanguagePHP

redis-banlist

Класс, позволяющий отсеивать траффик, по триггеру слишком частых запросов к вашему веб приложению. Это может быть как API, так и простое приложение на базе любого MVC фреймфорка (и не только его).

Что потребуется: Redis, PHP5, модуль php5-redis

Базовая и быстрая установка Ubuntu (Debian) sudo apt-get install redis-server php5-redis (подразумевается, что ядро PHP5 уже установлено и настроено)

Основная конфигурация коннектора класса находится в

private $config = [
        'host' => 'localhost', //хост
        'port' => 6379 //и порт на котором стартует Redis из "коробки"
    ];

Конфигурация триггеров поведения

private $spam_listener_key = [
        'ttl_per_request' => 10, //частота запросов в секундах. Период запросов с одного IP, при котором пользователь может быть ботом (установите свое значение)
        'name' => 'key:request:', //префикс ключа для удобства поиска "горячих пользователей". Пример живого ключа -  key:request:11.22.33.44
        'requests' => 30 //Счетчик подозрительных запросов, чаще чем ttl_per_request
    ];

API: Пример использования находится в test.php.

Более детально ниже.

Создаем экземпляр класса:

$black_list = new RedisBlackList();

Вызываем listen() для прослушивания траффика

$black_list->listen(bool $capture = false, bool $autoban = false);
//$capture - нужно ли перманентно логировать все запросы, проходящие через listen()?
//$autoban - после срабатывания триггера бана, отдавать ли этому IP 403 Forbidden?

Данный код желательно разместить до инициализации логики приложения.

Дополнительно: Для удаления IP из черного списка, можно воспользоваться следующим кодом:

$black_list = new RedisBlackList();
$black_list->unBanIP(string $ip);

#Формирование автоматических списков для веб серверов.

Подходит для отработки с помощью crontab

$black_list = new RedisBlackList();
$black_list->createBlackList(string $path_to_file, string $type);
$path_to_file -  путь к файлу с правами на запись без расширения файла. Например /path/to/my_black_list
$type - должен принимать или nginx, или apache

Далее этот файл необходимо подключить в конфигурации вебсервера. #Nginx

http {
  #некоторый конфиг
  include /path/to/my_black_list.conf;
  #некоторый конфиг
}

#Apache

В конфигурации виртуального хоста

RewriteEngine On
RewriteMap access txt:/path/to/my_black_list.txt
RewriteCond ${access:%{REMOTE_ADDR}} deny [NC]
RewriteRule ^ - [L,F]