fdb1c1cca2
Именованные лимитеры auth-login/auth-2fa/auth-password (perMinute 20 by IP) в AppServiceProvider; throttle-middleware на login/forgot/reset/2fa-verify/recovery в web.php. Закрывает per-IP объёмный перебор. Pest tests/Feature/Auth 97/97 GREEN. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2.0 KiB
2.0 KiB
Runbook: route-throttle на auth-эндпоинтах
Дата: 2026-06-17 · Зона: app/ (backend) · Связано: P1 go-live, open-items
Что сделано
Per-IP route-throttle (Laravel Throttle middleware) поверх уже существующего
прикладного per-credential rate-limit в auth-контроллерах. Закрывает пробел:
forgot/2fa/reset не имели per-IP объёмного предела (через разные email
можно было перебирать без преграды).
Лимитеры (app/app/Providers/AppServiceProvider.php::boot)
| Лимитер | Маршруты | Значение |
|---|---|---|
auth-login |
POST /api/auth/login |
perMinute(20)->by(ip) |
auth-2fa |
POST /api/auth/2fa/verify, /2fa/recovery-use |
perMinute(20)->by(ip) |
auth-password |
POST /api/auth/forgot, /reset-password |
perMinute(20)->by(ip) |
Применение — ->middleware('throttle:<name>') в app/routes/web.php.
register намеренно без throttle (вне P1-перечня).
Тюнинг
- 20/мин — стартовое значение, выбрано выше максимума тестовых циклов (login 11, forgot 7, 2fa 6), чтобы не ломать существующие auth-тесты.
- Для anti-enumeration на
forgotзначение можно снизить (например до 10/мин) после наблюдения боевого трафика — поправить число вboot(), прогнатьphp artisan test tests/Feature/Auth. - Превышение → стандартный Laravel 429 +
Retry-After.
Проверка
php artisan test tests/Feature/Auth (из каталога app) — 97 тестов, включая
AuthRouteThrottleTest (21-й forgot с одного IP → 429 от middleware).