Подтвердить что ты не робот

Сгенерировать новый токен CSRF без перезагрузки всей формы

Если пользователь выйдет из системы (из-за истечения срока действия сеанса или по другим причинам) в фоновом режиме при использовании моего приложения Symfony2, я внедрил на экране слой JS, позволяющий пользователю немедленно войти в систему и продолжить использовать веб-сайт.

Проблема в том, что если пользователь находится в середине заполнения формы и выходит из системы, после входа в систему с использованием уровня JS он все еще смотрит на ту же форму со значениями, которые он уже успел ввести, но его сеансовые изменения. Поэтому токен CSRF в форме недопустим.

Есть ли способ создать новый токен CSRF на основе текущего сеанса и конкретной формы, захватить его AJAX и заменить в форме? Или, может быть, есть другое решение?

Я не хочу отключать защиту CSRF.

4b9b3361

Ответ 1

Предполагая, что вы используете поставщик CSRF по умолчанию, в вашем контроллере AJAX вы можете получить свою услугу провайдера CSRF и "попросить" ее регенерировать токен:

Symfony 2.3 (и ранее)

/** @var \Symfony\Component\Form\Extension\Csrf\CsrfProvider\SessionCsrfProvider $csrf */
$csrf = $this->get('form.csrf_provider');
$token = $csrf->generateCsrfToken($intention); 

return new Response($token);

Symfony 2.4

/** @var \Symfony\Component\Security\Csrf\CsrfTokenManagerInterface $csrf */
$csrf = $this->get('security.csrf.token_manager');
$token = $csrf->refreshToken($intention);

return new Response($token);

Ответ 2

Используйте это для регенерации токена CSRF (с Symfony2.4):

$csrf = $this->get('security.csrf.token_manager'); //Symfony\Component\Security\Csrf\CsrfTokenManagerInterface
$token = $csrf->refreshToken($intention); // Intention is specified in form type

return new Response($token);

Ответ 3

Да, бот мог бы получить токен csrf и отправить что-то в форму, но поскольку токен привязан к сеансу, это не имеет значения. Точки CSRF не предназначены для предотвращения подачи форм ботами.

Ответ 4

Для меня проще решить перенаправить пользователя на ту же форму, передав данные alredy, вставленные через POST.
Таким образом, токен будет генерироваться снова автоматически.
Более того, вы не потеряете ввод данных.