К содержимому
DDoS·Protect
Платформы

Laravel: защита приложения и API на уровне фильтра

Laravel-приложения обычно уже используют встроенный throttle. Фильтр не заменяет его, а забирает на себя массовую часть атаки, чтобы лимиты приложения работали в нормальных условиях и не расходовали Redis и базу на каждый мусорный запрос.

Доверенные прокси

Чтобы request()->ip() возвращал адрес посетителя, а не узла фильтрации, укажите адреса фильтра в списке доверенных прокси. Не используйте «доверять всем» — иначе адрес можно подделать заголовком. В Laravel 10 и раньше то же задаётся свойством $proxies в классе App\Http\Middleware\TrustProxies.

// bootstrap/app.php (Laravel 11+)
->withMiddleware(function (Middleware $middleware) {
    $middleware->trustProxies(at: [
        '203.0.113.0/24', // адреса узлов фильтрации (условные)
    ]);
})
Пример настройки доверенных прокси (адреса условные)

Throttle и лимиты фильтра

Middleware throttle и RateLimiter считают запросы по ключу, который вы задаёте. Чаще всего это $request->ip(), и если доверенные прокси не настроены, все посетители получают один адрес узла фильтрации и одновременно упираются в лимит. Для входа полезно ограничивать по связке «логин + адрес», для API — по пользователю или токену Sanctum.

// app/Providers/AppServiceProvider.php, метод boot()
RateLimiter::for('login', function (Request $request) {
    return [
        Limit::perMinute(5)->by(Str::lower($request->input('email')).'|'.$request->ip()),
        Limit::perMinute(30)->by($request->ip()),
    ];
});
Два лимита на вход: по учётной записи с адресом и по адресу

Адреса, которые стоит защитить

АдресПравило
/login, /register, /forgot-password (Breeze, Fortify, Jetstream)Лимиты на попытки и на отправку писем, проверка браузера при всплеске
/api/*Лимиты по токену и методу; без проверки браузера для мобильного приложения
/livewire/update (Livewire 3)Лимиты на сессию
/horizon, /telescope, /pulseЗакрыть от интернета: доступ только с разрешённых адресов
/sanctum/csrf-cookieНе блокировать: SPA запрашивает его перед входом

Livewire и SPA

Запросы Livewire и SPA к API идут через XHR. Проверка браузера для них проходит один раз на странице, после чего запросы выполняются с полученным токеном.

Что исключить из проверки браузера

  • Вебхуки платёжных систем и сервисов — например, маршрут Cashier /stripe/webhook или ваши /webhooks/*. Их подлинность проверяет подпись, а не браузер.
  • Маршрут /up (Laravel 11+), который опрашивает мониторинг.
  • Входящие запросы интеграций по API-ключу.

Очереди и планировщик (queue:work, schedule:run) работают из командной строки и через фильтр не проходят — их перенастраивать не нужно.

Типичные ошибки

  • trustProxies(at: '*') при сервере, доступном напрямую: заголовок X-Forwarded-For принимается от кого угодно, и адрес можно подделать. Настоящий IP сервера стоит скрыть.
  • Telescope включён в продакшене и открыт — он показывает запросы, исключения и данные пользователей.
  • APP_DEBUG=true — страница ошибки раскрывает конфигурацию и пути.

Вопросы и ответы

Заменит ли фильтр middleware throttle?

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

Что меняется для Laravel Octane?

Настройка доверенных прокси та же. Octane ускоряет обработку, но число воркеров по-прежнему ограничено, и медленные запросы к базе при флуде занимают их так же, как и без него.

Ранний доступ

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

Сервис готовится к запуску. Оставьте заявку: проверим, от чего нужно защищать ваш проект, и подключим его в числе первых на условиях раннего доступа.