Конфигурация Middleware в Laravel 11

Источник: «Security Tip: Laravel 11's Middleware Configuration»
В Laravel 11 middleware по умолчанию перенесено в сам фреймворк, а конфигурация передаётся через класс bootstrap/app.php.

Начинаем новую серию статей о функциях безопасности Laravel 11 с первых строк Release Notes. Первое изменение, связанное с безопасностью, с которым мы столкнулись, — это реструктуризация стандартного приложения Middleware:

Ранее новые приложения Laravel включали девять модулей middleware. Эти модули выполняли различные задачи, такие как аутентификация запросов, обрезка входных строк и проверка CSRF-токенов.

В Laravel 11 эти модули middleware были перенесены в сам фреймворк, чтобы не загромождать структуру вашего приложения. Во фреймворк были добавлены новые методы для настройки поведения этих middleware, и их можно вызывать из файла bootstrap/app.phpвашего приложения.

->withMiddleware(function (Middleware $middleware) {
$middleware->validateCsrfTokens(
except: ['stripe/*']
);

$middleware->web(append: [
EnsureUserIsSubscribed::class,
])
})

Хотя это отлично подходит для снижения уровня шума в стандартных приложениях, тем более что в большинстве приложений ничего менять не придётся. Однако это усложняет поиск middleware, связанного с безопасностью, и внесение необходимых изменений.

Чтобы было проще разобраться в том, что доступно и что это даёт, далее приведены различные методы настройки middleware, доступные в настоящее время:

Отключение шифрования cookie

Laravel автоматически шифрует значения cookie, обеспечивая их безопасность. Если нужен доступ к ним за пределами Laravel, можно отключить шифрование определённых значений. (Документация Laravel)

->withMiddleware(function (Middleware $middleware) {
$middleware->encryptCookies(except: [
'cookie_name',
]);
})

Отключение CSRF защиты

Иногда требуется отключить CSRF защиту на определённых маршрутах, таких как веб-хуки или внешние API. (Документация Laravel)

->withMiddleware(function (Middleware $middleware) {
$middleware->validateCsrfTokens(except: [
'stripe/*',
'http://example.com/foo/bar',
'http://example.com/foo/*',
]);
})

Исключение параметров из валидации подписанных URL

Сайты социальных сетей, рассылки по электронной почте и аналитика любят добавлять дополнительные параметры в URL, когда пользователи кликают на них, однако эти дополнительные параметры могут сломать подписанные URL. Чтобы избежать этого, можно специально исключить эти дополнительные параметры из валидации. (Документация Laravel)

->withMiddleware(function (Middleware $middleware) {
$middleware->validateSignatures(except: [
'fbclid',
'utm_campaign',
'utm_content',
'utm_medium',
'utm_source',
'utm_term',
]);
})

Настройка доверенных хостов и прокси

Важно настроить доверенные узлы и прокси-серверы, чтобы предотвратить атаки отравления переадресованных узлов, которые могут направлять вредоносные запросы к приложению. Наиболее распространённым примером является запуск писем сброса пароля, содержащих ссылки на внедрённый злоумышленником домен. (Документация Laravel)

->withMiddleware(function (Middleware $middleware) {
$middleware
->trustProxies(at: [
'192.168.1.1',
'192.168.1.2',
])
->trustHosts(
at: ['laravel.test']
);
})

Разрешение определённых маршрутов во время технического обслуживания

Иногда необходимо разрешить работу определённых маршрутов при включённом режиме обслуживания.

->withMiddleware(function (Middleware $middleware) {
$middleware->preventRequestsDuringMaintenance(except: [
'stripe/*',
]);
})

Включение ограничения доступа к API

Чтобы предотвратить злоупотребления и вредоносные действия, стоит включить разумное ограничение доступа к API. (Документация Laravel)

->withMiddleware(function (Middleware $middleware) {
$middleware->throttleApi(limiter: 'api', redis: true);
})

Аннулирование 'web' сессий на других устройствах

В качестве дополнительного уровня безопасности можно аннулировать все активные сеансы на других устройствах, либо кликнув по кнопке, либо после смены пароля. (Документация Laravel)

->withMiddleware(function (Middleware $middleware) {
$middleware->authenticateSessions();
})

Их было немало, но мы добрались до конца.

Надеюсь, что это будет полезным руководством — некоторые из них не полностью документированы (пока), и нет краткого справочника.

Дополнительные материалы

Предыдущая Статья

В чём разница между Virtual DOM и Shadow DOM

Следующая Статья

Руководство по MySQL JOIN с примерами