Троттлинг (от англ. throttling - дросселирование) - это механизм ограничения частоты запросов, который не блокирует доступ полностью, а замедляет обработку запросов при превышении лимитов.
В отличие от традиционных методов защиты, которые полностью блокируют доступ, троттлинг использует прогрессивное замедление и добавляет искусственные задержки, чтобы ограничить интенсивность запросов.
Настройки троттлинга в файле settings.php:
// Включение/отключение троттлинга
define('THROTTLING_ENABLED', true);
// Настройки для общего троттлинга
define('THROTTLING_DEFAULT_LIMIT', 60); // Лимит запросов в окне
define('THROTTLING_DEFAULT_WINDOW', 60); // Размер окна в секундах
define('THROTTLING_DEFAULT_MAX_DELAY', 1000); // Максимальная задержка в мс
// Настройки для API запросов
define('THROTTLING_API_LIMIT', 20); // Лимит API запросов
define('THROTTLING_API_WINDOW', 60); // Размер окна для API
define('THROTTLING_API_MAX_DELAY', 2000); // Максимальная задержка для API
// Настройки для попыток входа
define('THROTTLING_LOGIN_LIMIT', 5); // Лимит попыток входа
define('THROTTLING_LOGIN_WINDOW', 300); // Размер окна для входа
define('THROTTLING_LOGIN_MAX_DELAY', 5000); // Максимальная задержка для входа
Алгоритм расчета задержки:
// Если превышен лимит, применяем троттлинг
if ($count > $limit) {
$result['throttled'] = true;
// Вычисляем задержку: чем больше превышение, тем дольше задержка
$overLimit = $count - $limit;
$delayFactor = min(1, $overLimit / $limit); // От 0 до 1
$result['delay'] = (int)($maxDelay * $delayFactor);
// Добавляем соответствующие заголовки
$this->addThrottlingHeaders($result);
// Если настроено, применяем задержку
if (defined('THROTTLING_APPLY_DELAY') && THROTTLING_APPLY_DELAY) {
$this->applyDelay($result['delay']);
}
}
Применение задержки:
private function applyDelay($milliseconds) {
// Проверяем, разрешены ли функции сна
if (!in_array('usleep', array_map('trim', explode(',', ini_get('disable_functions'))))) {
// Применяем задержку (1 миллисекунда = 1000 микросекунд)
usleep($milliseconds * 1000);
} else {
// Альтернативный метод задержки через цикл
$start = microtime(true);
$end = $start + ($milliseconds / 1000);
while (microtime(true) < $end) {
// Активное ожидание
}
}
}
usleep() потребляет ресурсы процессора| Тип запросов | Причина использования троттлинга | Рекомендуемые настройки |
|---|---|---|
| API-запросы | Предотвращение чрезмерного использования ресурсов API | THROTTLING_API_LIMIT = 20THROTTLING_API_WINDOW = 60 |
| Формы авторизации | Защита от перебора паролей и брутфорс-атак | THROTTLING_LOGIN_LIMIT = 5THROTTLING_LOGIN_WINDOW = 300 |
| Поисковые запросы | Ограничение запросов к базе данных и защита от поисковых DoS | THROTTLING_SEARCH_LIMIT = 10THROTTLING_SEARCH_WINDOW = 60 |
| Сложные вычисления | Ограничение частоты ресурсоемких операций | Индивидуальные настройки по конкретным URL |
| Защита от DDoS | Смягчение некритичных DDoS-атак | THROTTLING_DEFAULT_LIMIT = 40THROTTLING_DEFAULT_MAX_DELAY = 2000 |
// Общие настройки
define('THROTTLING_ENABLED', true);
define('THROTTLING_DEFAULT_LIMIT', 60); // 60 запросов в минуту
define('THROTTLING_DEFAULT_WINDOW', 60); // окно 60 секунд
define('THROTTLING_DEFAULT_MAX_DELAY', 500); // максимум 0.5 сек
// В медленных скриптах рекомендуется отключать троттлинг
define('THROTTLING_ENABLED', false); // отключен для этой страницы
// Или указывать специальный более мягкий лимит
define('THROTTLING_DEFAULT_LIMIT', 20); // низкое число запросов
define('THROTTLING_DEFAULT_WINDOW', 300); // но в большом окне (5 мин)
define('THROTTLING_DEFAULT_MAX_DELAY', 200); // с минимальной задержкой
// Настройки для защиты форм авторизации
define('THROTTLING_LOGIN_LIMIT', 5); // 5 попыток
define('THROTTLING_LOGIN_WINDOW', 300); // за 5 минут
define('THROTTLING_LOGIN_MAX_DELAY', 5000); // задержка до 5 секунд
| Метод защиты | Преимущества | Недостатки |
|---|---|---|
| Блокировка IP | Полностью останавливает атаку, экономит ресурсы | Возможны ложные срабатывания, более жесткий подход |
| Троттлинг | Более гибкий, допускает легитимные запросы | Потребляет больше ресурсов, не полностью блокирует атаки |
| CAPTCHA | Высокая эффективность против ботов | Ухудшает пользовательский опыт, требует взаимодействия |
| Rate Limiting | Простой в реализации, эффективный | Более грубый подход (все-или-ничего) |
Троттлинг является эффективным механизмом защиты веб-приложений от чрезмерного использования ресурсов и потенциальных атак. В отличие от жестких методов блокировки, он предлагает более гибкий подход, который позволяет легитимным пользователям продолжать работу с сайтом, хотя и с некоторой задержкой.
При правильной настройке троттлинг может значительно улучшить стабильность вашего сервера и защитить от различных типов атак. Однако важно помнить, что при высокой нагрузке троттлинг может создавать дополнительную нагрузку на сервер из-за удержания соединений и использования ресурсов процессора для задержек.
Мы рекомендуем использовать троттлинг выборочно, для конкретных типов запросов и регулярно анализировать его эффективность на вашем сервере.
Документ составлен на основе анализа кода security_monitor.php и settings.php, март 2025 г.