Конфигурация Middleware в Laravel 11
Начинаем новую серию статей о функциях безопасности 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();
})
Их было немало, но мы добрались до конца.
Надеюсь, что это будет полезным руководством — некоторые из них не полностью документированы (пока), и нет краткого справочника.