Экспоненциальное ограничение запросов в Laravel: надёжная защита API от атак и перегрузок

Узнайте, как работает экспоненциальное ограничение запросов (Exponential Throttling) в Laravel, зачем оно нужно и как повышает безопасность и устойчивость API. Узнавайте о новых статьях первыми! Подписываетесь на email рассылку или вступайте в Telegram-канал.

Экспоненциальное ограничение запросов в Laravel: надёжная защита API от атак и перегрузок
12.12.2025 24.01.2026 36

Экспоненциальное ограничение запросов в Laravel: как защитить API от перегрузок и ботов

В современных веб-проектах API остаётся ключевой точкой взаимодействия между клиентом и сервером. Однако вместе с ростом нагрузки увеличиваются и риски: бот-атаки, частые повторные запросы, сканирование эндпоинтов, попытки подбора токенов и другие сценарии, способные вывести систему из строя. Классические Rate-Limit механизмы уже недостаточно эффективны для сложных атак. На смену приходит экспоненциальное ограничение запросов (Exponential Throttling) — гибкий метод, который увеличивает время блокировки при повторных нарушениях.

В этой статье разберём, как работает подобная защита на примере кастомного middleware на Laravel, что оно решает и почему такой подход критически важен для устойчивости API.


Что такое экспоненциальный троттлинг

Экспоненциальный троттлинг — это механизм, который увеличивает время блокировки пользователя при повторных превышениях лимита запросов.
Суть проста:

  • Первое превышение → короткая блокировка

  • Второе → в 2 раза дольше

  • Третье → в 4 раза дольше

  • До максимального предела

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


<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Cache;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class ExponentialThrottleMiddleware
{
    public function handle(Request $request, Closure $next, int $maxAttempts = 5, int $baseDecaySeconds = 60, int $maxDecaySeconds = 3600): Response
    {
        $ip = $request->ip();
        $uri = $request->route()->uri();
        $key = 'exp_throttle:' . md5($ip . $uri);

        $data = Cache::get($key, [
            'attempts' => 0,          // количество запросов в текущей порции
            'failures' => 0,          // количество превышений лимита
            'blocked_until' => null
        ]);

        $now = time();

        // Проверяем блокировку
        if ($data['blocked_until'] && $data['blocked_until'] > $now) {
            $remaining = $data['blocked_until'] - $now;

            if($uri !== 'api/cpa/receiving') {
                \Log::channel('exp_throttle')->debug("$ip | $uri", [
                    'remaining' => $remaining,
                    'ip' => $ip,
                    'uri' => $uri,
                    'key' => $key,
                    'data' => $data,
                ]);

                sleep(rand(1, 3));
            }

            return response()->json([
                'message' => "Повторите попытку позже"
            ], 429);
        }

        // Если блокировка прошла, сбрасываем attempts
        if ($data['blocked_until'] && $data['blocked_until'] <= $now) {
            $data['attempts'] = 0;
            $data['blocked_until'] = null;
        }

        // Увеличиваем кол-во попыток в текущей порции
        $data['attempts']++;

        // Если превышен лимит порции
        if ($data['attempts'] >= $maxAttempts) {
            $data['failures']++;  // увеличиваем количество превышений лимита
            $data['blocked_until'] = $now + min(pow(2, $data['failures'] - 1) * $baseDecaySeconds, $maxDecaySeconds);
            $data['attempts'] = 0; // новая порция начнется после блокировки
        }

        Cache::put($key, $data, $maxDecaySeconds);

        return $next($request);
    }
}

Как работает ExponentialThrottleMiddleware в Laravel

Приведённый PHP-код реализует полноценную систему экспоненциального ограничения запросов. Рассмотрим логику по шагам.

1. Идентификация пользователя

$ip = $request->ip();
$uri = $request->route()->uri();
$key = 'exp_throttle:' . md5($ip . $uri);

Ограничение привязывается к IP + конкретному маршруту, что предотвращает массовые атаки по одному endpoint.


2. Хранение состояния попыток

$data = Cache::get($key, [
    'attempts' => 0,
    'failures' => 0,
    'blocked_until' => null
]);

В кэше сохраняются три ключевых параметра:

  • attempts — количество попыток в текущем цикле

  • failures — число превышений лимита

  • blocked_until — время, до которого запросы заблокированы


3. Проверка активной блокировки

Если пользователь уже заблокирован, middleware:

  • логирует событие

  • вводит случайную задержку sleep(rand(1,3))
    — усложняет автоматические атаки

  • возвращает HTTP 429 Too Many Requests

Это помогает защищать API от спама, перебора и роботизированных запросов.


4. Экспоненциальное увеличение блокировки

$data['blocked_until'] = $now + min(
    pow(2, $data['failures'] - 1) * $baseDecaySeconds,
    $maxDecaySeconds
);

Блокировка растёт по формуле:

2^(n−1) × базовое время блокировки (baseDecaySeconds)

Например:

Кол-во нарушений

Время блокировки

1

60 секунд

2

120 секунд

3

240 секунд

4

480 секунд

до maxDecaySeconds


5. Сброс попыток и сохранение состояния

После каждой блокировки:

  • attempts обнуляется

  • failures увеличивается

  • данные сохраняются в кэше до максимального decay срока

Таким образом middleware формирует динамическое и адаптивное ограничение API.


Что даёт экспоненциальный троттлинг вашему проекту

  • 🔐 Защита от DDoS-атак на REST API

  • 🚫 Предотвращение перебора параметров и brute-force-подборов

  • ⚙️ Снижение нагрузки на сервер и БД

  • Автоматическое замедление повторных нарушителей

  • 🔎 Чистые логи и контроль аномальных активностей

  • Минимальное влияние на обычных пользователей

Эта система подходит как для публичных API, так и для внутренних микросервисов.


Пример использования в Laravel

1. Подключение middleware

Сначала зарегистрируем middleware в app/Http/Kernel.php:

protected $routeMiddleware = [
    // ...
    'expThrottle' => \App\Http\Middleware\ExponentialThrottleMiddleware::class,
];

2. Применение к маршрутам API

use Illuminate\Support\Facades\Route;

Route::middleware(['expThrottle:5,60,3600'])->group(function () {
    Route::post('/api/login', 'AuthController@login');
});

Здесь:

  • 5 — максимальное количество попыток за один цикл

  • 60 — базовое время блокировки в секундах

  • 3600 — максимальное время блокировки

Middleware будет контролировать каждый IP + маршрут отдельно, автоматически увеличивая время блокировки при повторных нарушениях.


3. Практический сценарий применения

  1. Защита от brute-force при логине:
    Пользователь или бот делает множество неверных попыток входа. Middleware блокирует IP с экспоненциальным увеличением времени, что делает атаки неэффективными.

  2. API для партнёрских программ (CPA):
    Если множество автоматизированных запросов пытается отправить данные о конверсиях, middleware ограничивает поток, предотвращая перегрузку сервера.

  3. Общий контроль нагрузки на сервер:
    Даже при резком увеличении трафика обычные пользователи остаются доступными, а агрессивные IP замедляются.

Мы разрабатываем и внедряем продвинутые системы защиты API

Если вам нужна:

  • кастомная система rate-limit и антибот-защиты

  • улучшение производительности API

  • оптимизация Laravel middleware

  • разработка безопасной архитектуры запросов

  • внедрение логирования и мониторинга поведения клиентов

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

Подписаться на рассылку

Статья: "Экспоненциальный троттлинг в Laravel: защита API от брутфорса и ботов"

Понравилась статья "Экспоненциальный троттлинг в Laravel: защита API от брутфорса и ботов"? Получайте информацию первыми о последних трендах в сфере веб-разработки и SEO-оптимизации, AI и дизайне, подписавшись на нашу email рассылку, оставив почту. Обещаем, никакого спама.

Вступайте в наш Telegram канал, чтобы получать пуш уведомления о новых публикациях и быть частью растущего сообщества!

Telegram-канал

Автор статьи

Мы стараемся делать статьи максимально полезными и информативными

Автор статьи
Никита Ив (Full-stack web-developer)

Спасибо за прочтение статьи "Экспоненциальный троттлинг в Laravel: защита API от брутфорса и ботов", если статья показалась вам полезной, можете поделиться ею с друзьями и коллегами. Также, можете подписаться на Email-рассылку, обещаю регулярно отправлять вам полезную информацию, статьи и никакого спама.

Немного расскажу о себе, являюсь full-stack разработчиком и основателем проекта webseed.ru. Более 7-ми лет создаю веб-сайты, приложения, личные кабинеты, CRM, админки, магазины, интеграции и многое другое. За годы работы с клиентами, я приобрел огромный опыт в разработке и создании веб-проектов, что позволяет мне предлагать качественные и современные решения для наших клиентов и делиться полезным опытом.

Связанные услуги

Вы можете заказать услуги из статьи у нас

Все услуги

Другие статьи

Полезные статьи о создании и продвижении сайтов, AI, дизайне и трендах в веб-разработке

Все категории

О нас

Информация о компании

Мы имеем широкий опыт в реализации и технической поддержке коммерческих онлайн-проектов. Реализованные нами решения автоматизируют и оптимизируют бизнес-процессы компании, повышают конверсию и привлекают новых клиентов.

За всё время работы, нами были воплощены в жизнь IT-проекты в финансово-кредиторном и автомобильном секторе, в сфере отдыха, туризма и услуг, онлайн-торговле, электронной коммерции, строительстве и ИИ.

Прокачайте онлайн-направление Вашего бизнеса и выведите его на совершенно иной уровень, вместе с Webseed.ru

  • Заказов и проектов100+30% за последний год
  • Бизнес отраслей10На данный момент
  • 90%Клиентовпо рекомендациям
Все достиженияКонтакты
О компании Webseed.ru

Контакты

Наш адрес, контакты для связи и мессенджеры

Контакты (в Иркутске)

Данные о компании

  • ИП: Иванов Никита Эдуардович
  • ИНН: 165036260002
  • ОГРНИП: 325169000241540
  • Банк: ООО "Банк Точка"
  • БИК: 044525104
  • Корр. счет: 30101810745374525104
  • Расчетный счет: 40802810520000814743
  • Адрес банка: 109044, Российская Федерация, г. Москва, вн.тер.г. муниципальный округ Южнопортовый, пер. 3-й Крутицкий, д.11, помещ. 7Н
Карта партнера
КонтактыГлавнаяУслугиTelegram