Если верить статистике, до 80% взломов сайтов связан с использованием слабых или украденных паролей. Одним из самых распространённых методов атаки является Brute Force — автоматический перебор комбинаций логин/пароль до тех пор, пока не будет найдена правильная пара.
Если ваше приложение не защищено от такого рода атак, оно становится лёгкой мишенью. Каждая попытка входа нагружает сервер, проверяет базу данных и тратит ресурсы. А в случае успеха — компрометирует данные пользователей.
Throttle middleware в Laravel — это простой, но мощный инструмент, который позволяет ограничить количество запросов от одного источника за определённый промежуток времени. В этой статье мы изучим:
Что это делает?
Route::post('/login', [LoginController::class, 'index'])
->middleware('throttle:5,1');
«Разрешить максимум 5 попыток входа в течение 1 минуты с одного источника (IP-адреса)».
Как работает?
| Параметр | Значение |
|---|---|
| 5 | Максимальное количество запросов |
| 1 | Временной интервал в минутах |
Поведение:
- Пользователь пытается войти 5 раз — всё ок.
- На 6-ю попытку (в течение той же минуты) — получает ответ 429 Too Many Requests.
- Счётчик сбрасывается через 1 минуту.
Зачем это нужно в авторизации?
Защита от:
Brute Force — перебор паролей автоматическими скриптами.
Bot-атак — массовые попытки входа с разных паролей.
DoS — замедление сервера из-за бесконечных проверок.
Пример атаки без throttle:
Злоумышленник: 100 попыток в секунду → сервер перегружен
С throttle: 5 попыток → блокировка на 1 минуту → атака бесполезна
Где это настраивается?
Laravel 8+: В app/Http/Kernel.php уже зарегистрирован:
protected $middlewareAliases = [
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];
Расширенные примеры
// 5 попыток за 1 минуту
->middleware('throttle:5,1')
// 10 попыток за 5 минут
->middleware('throttle:10,5')
// Привязка к пользователю (если авторизован)
->middleware('throttle:5,1,username')
// Кастомное сообщение об ошибке
->middleware('throttle:5,1:too-many-attempts')
Ответ при превышении лимита
HTTP 429 Too Many Requests
{
"message": "Too many attempts. Please try again in 60 seconds."
}
Или кастомный ответ, если настроить в app/Exceptions/Handler.php.
Рекомендация для логина
Route::post('/login', [LoginController::class, 'index'])
->middleware('throttle:5,1'); // Защита от перебора
Это обязательная практика для любого метода авторизации в продакшене.