Экспоненциальное ограничение запросов в 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. Практический сценарий применения
Защита от brute-force при логине:
Пользователь или бот делает множество неверных попыток входа. Middleware блокирует IP с экспоненциальным увеличением времени, что делает атаки неэффективными.API для партнёрских программ (CPA):
Если множество автоматизированных запросов пытается отправить данные о конверсиях, middleware ограничивает поток, предотвращая перегрузку сервера.Общий контроль нагрузки на сервер:
Даже при резком увеличении трафика обычные пользователи остаются доступными, а агрессивные IP замедляются.
Мы разрабатываем и внедряем продвинутые системы защиты API
Если вам нужна:
кастомная система rate-limit и антибот-защиты
улучшение производительности API
оптимизация Laravel middleware
разработка безопасной архитектуры запросов
внедрение логирования и мониторинга поведения клиентов
— обратитесь к нам.
Мы внедрим оптимальное решение под ваш проект и обеспечим устойчивость API даже под высокой нагрузкой.







