Остановить восстановление/аннулирование CSRF при аутентификации

В настоящее время у меня есть формы на моей странице, которые есть независимо от того, вошел ли пользователь в систему или нет. Как только пользователь входит в систему, им предоставляется одна из этих форм (которые используют CSRF).

Проблема в том, что если это поле представлено после аутентификации, токены CSRF становятся недействительными. Я подтвердил это, разрешив себе отправить форму без проверок проверки подлинности и $form->isValid() возвращает true, тогда как после входа в систему он дает мне false с ошибкой:

Символ CSRF недействителен. Повторите отправку формы.

Я предполагаю, что есть три решения: остановить Symfony от регенерации/аннулирования токенов CSRF при аутентификации, удалить токены CSRF из этих форм или сгенерировать мою форму после проверки подлинности (я бы скорее избежал этого, однако). Мое текущее решение состоит в том, чтобы передать новый токен CSRF обратно с аутентификацией и установить токен формы input.

Дополнительно. Кто-нибудь знает, как просмотреть все токены CSRF, которые в настоящее время назначены? Сессия, похоже, не удерживает их.

Ответ 1

Спасибо @MarkFox за то, что указали мне на этот CWE - хотя я знал, что это был дизайн, я надеялся, что будет путь для меня, чтобы не идти по маршруту, в котором я оказался.

Для всех, кого интересует, CWE заявляет:

Аутентификация пользователя или иное установление нового сеанса пользователя без аннулирования любого существующего идентификатора сеанса дает злоумышленнику возможность украсть прошедшие проверку сеансы.

По этой причине я рекомендую вам перейти по пути, в который я попал, отправив новые токены запроса через AJAX и поместив их в соответствующие формы.

Ответ 2

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

Однако, если вы действительно не хотите этого делать, вы сказали:

Мое текущее решение состоит в том, чтобы передать новый токен CSRF обратно с идентификационным значением и ввести значение входного токена формы.

Просто сделай это. В этом нет ничего плохого.