Формы Symfony, возвращающие токен CSRF, недопустимы из запросов AJAX - PullRequest
0 голосов
/ 02 октября 2019

У нас есть приложение Symfony 4.3, на странице которого есть несколько запросов AJAX. Каждый ответ AJAX содержит несколько форм, и каждая форма имеет свой собственный токен CSRF. Однако только один из вызовов AJAX может сохранить свой токен в сеансе. Поэтому все формы в запросах AJAX завершатся ошибкой с сообщением

The CSRF token is invalid. Please try to resubmit the form.

За исключением одной формы, которой удается правильно сохранить свой токен в сеансе.

Сессия сохраняется в Redis.

Как я могу убедиться, что все токены CSRF хранятся в сеансе при выполнении нескольких вызовов AJAX?

1 Ответ

0 голосов
/ 02 октября 2019

Токен CSRF частично использует куки. Когда вы генерируете две CSRF на одной странице и отправляете одну из форм, вы лишаете законной силы cookie.

Без каких-либо расширений на самой платформе я действительно могу только увидеть один способ обойти это - и это довольнокарусель:

Что вы можете сделать, это настроить контроллер, который генерирует форму вашего приложения.

При начальной загрузке страницы ваш контроллер загрузит как форму входа, так и форму приложения. После отправки формы входа в систему через AJAX вы также будете запрашивать ТОЛЬКО контроллер для формы приложения (которая также даст пользователю новый файл cookie). С помощью javascript вы можете извлечь токен NEW csrf из новой формы и вставить его в исходную форму приложения. Затем, когда вы отправляете форму приложения, у нее должен быть новый действительный токен csrf.

Чтобы проиллюстрировать:

Получить форму приложения и форму входа -> отправить логин через AJAX -> получить приложениеформа через AJAX в фоновом режиме -> украсть токен новой формы приложения csrf и вставить его в первую форму приложения -> отправить форму приложения.

      $.ajaxSetup({
  headers: {
    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
  }
});

добавить это в свой заголовок - >>

<meta name="csrf-token" content="{{ csrf_token() }}">
...