Новое в Symfony 7.2: Stateless CSRF
- Pull Request: [Security] Implement stateless headers/cookies-based CSRF protection #58095 Nicolas Grekas
Symfony 7.2 представляет значительное усовершенствование функций безопасности: Stateless CSRF защита. Новая функция использующая комбинацию куки и HTTP заголовков для проверки непостоянных токенов.
Основное преимущество этой функции перед традиционными методами CSRF заключается в том, что токены проверяются независимо от сессий на стороне сервера. Это делает её подходящей для приложений, использующих HTTP-кэширование. Кроме того, отсутствие зависимости от сеансов гарантирует, что пользователи не потеряют свои данные, если потратят определённое время на отправку формы. Например, если во время заполнения формы сессия пользователя будет уничтожена, функция Запомнить меня
подключит его заново, и отправка формы будет принята.
Включение Stateless CSRF
Чтобы включить Stateless CSRF защиту в Symfony 7.2, обновите конфигурацию Symfony следующим образом:
# config/packages/framework.yaml
framework:
csrf_protection:
stateless_token_ids: ['my_stateless_token_id']
Опция stateless_token_ids
— это одна из частей, делающая функцию Stateless CSRF такой же безопасной, как и традиционный CSRF, поскольку в ней явно перечислены идентификаторы токенов, разрешённые при использовании новой функции.
Следующие опции также были добавлены в опцию csrf_protection
:
cookie_name
: имя используемого cookie (по умолчанию:csrf-token
);check_header
: еслиtrue
, то CSRF-токен проверяется в HTTP-заголовке в дополнение к cookie (по умолчанию:false
).
Как работает Stateless CSRF
Во-первых, источник запроса проверяется с помощью HTTP-заголовков Origin
/Referer
. Это зависит от того, способно ли приложение определить своё собственное целевое происхождение. Если вы находитесь за обратным прокси, не забудьте настроить обратный прокси на отправку соответствующих HTTP-заголовков X-Forwarded-*
/Forwarded
.
Далее запрос проверяется с помощью куки и CsrfToken
. Если куки найдены, они должны содержать то же значение, что и CsrfToken
. Фрагмент JavaScript на стороне клиента отвечает за выполнение этой двойной передачи. Значение токена должно перегенерироваться при каждом запросе с помощью криптографически безопасного генератора случайных чисел.
Если отсутствует механизм двойной отправки или HTTP-заголовки Origin
/Referer
, это обычно указывает на то, что JavaScript отключён на стороне клиента, фрагмент JavaScript не был реализован должным образом или заголовки Origin
/Referer
были отфильтрованы. Запросы, в которых отсутствует информация о двойном отправлении и происхождении, считаются небезопасными.
В новых приложениях Symfony, использующих Symfony Flex, эта функция stateless CSRF будет включена по умолчанию, благодаря обновлённому рецепту, добавляющему следующую конфигурацию:
# config/packages/framework.yaml
framework:
form: { csrf_protection: { token_id: 'submit' } }
csrf_protection:
stateless_token_ids: ['submit', 'authenticate', 'logout']