Троттлинг запросов: руководство и влияние на сервер

Троттлинг (от англ. throttling - дросселирование) - это механизм ограничения частоты запросов, который не блокирует доступ полностью, а замедляет обработку запросов при превышении лимитов.

Принцип работы троттлинга

В отличие от традиционных методов защиты, которые полностью блокируют доступ, троттлинг использует прогрессивное замедление и добавляет искусственные задержки, чтобы ограничить интенсивность запросов.

Основные этапы работы троттлинга:

  1. Определение лимитов для разных типов запросов
  2. Подсчет запросов от пользователя или IP-адреса
  3. Расчет задержки при превышении лимита
  4. Применение задержки к запросам
  5. Добавление заголовков с информацией о лимитах

Реализация в коде security_monitor.php

Настройки троттлинга в файле 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) {
            // Активное ожидание
        }
    }
}

Влияние троттлинга на сервер

Положительное влияние

1. Защита от перегрузки

  • Равномерное распределение нагрузки
  • Предотвращение исчерпания ресурсов
  • Контроль пиковых нагрузок
  • Защита от атак типа DDoS

2. Гибкость защиты

  • Вместо жесткой блокировки - постепенное замедление
  • Легитимные пользователи продолжают получать доступ
  • Меньше ложноположительных срабатываний
  • Более "дружелюбный" механизм защиты

3. Дифференцированный подход

  • Разные лимиты для разных действий (API, логин, поиск)
  • Пропорциональное увеличение задержки при росте нагрузки
  • Возможность настройки под конкретные URL или функции

Отрицательное влияние

1. Повышенное использование ресурсов

  • Каждый запрос с троттлингом занимает соединение дольше
  • Функция usleep() потребляет ресурсы процессора
  • Увеличивается объем памяти для отслеживания запросов

2. Накопление одновременных соединений

  • Запросы обрабатываются медленнее, но не отбрасываются
  • Может достигаться лимит максимальных соединений сервера
  • Увеличивается вероятность истощения пула воркеров

3. Блокировка сессий

  • PHP блокирует сессию на время обработки запроса
  • При задержках сессия остается заблокированной дольше
  • Возможны проблемы при параллельных запросах

4. Проблемы с медленными страницами

  • Для медленных страниц троттлинг добавляет еще больше задержки
  • Пользователь может воспринимать это как неработоспособность сайта

Когда использовать троттлинг

Тип запросов Причина использования троттлинга Рекомендуемые настройки
API-запросы Предотвращение чрезмерного использования ресурсов API THROTTLING_API_LIMIT = 20
THROTTLING_API_WINDOW = 60
Формы авторизации Защита от перебора паролей и брутфорс-атак THROTTLING_LOGIN_LIMIT = 5
THROTTLING_LOGIN_WINDOW = 300
Поисковые запросы Ограничение запросов к базе данных и защита от поисковых DoS THROTTLING_SEARCH_LIMIT = 10
THROTTLING_SEARCH_WINDOW = 60
Сложные вычисления Ограничение частоты ресурсоемких операций Индивидуальные настройки по конкретным URL
Защита от DDoS Смягчение некритичных DDoS-атак THROTTLING_DEFAULT_LIMIT = 40
THROTTLING_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 г.