Неверный токен CSRF. Попробуйте повторно отправить форму

Я получаю это сообщение об ошибке каждый раз, когда я пытаюсь отправить форму:

Неверный токен CSRF. Попробуйте повторно отправить форму

Мой код формы:

<form novalidate action="{{path('signup_index')}}" method="post" {{form_enctype(form)}} role="form" class="form-horizontal"> <div class="form-group"> {{ form_label(form.email, 'Email', {'label_attr': {'class': 'col-md-1 control-label'}}) }} {{ form_widget(form.email, {'attr': {'class': 'col-md-2'}}) }} {{ form_errors(form.email) }} </div> <div class="form-group"> {{ form_label(form.nickname, 'Nickname', {'label_attr': {'class': 'col-md-1 control-label'}}) }} {{ form_widget(form.nickname, {'attr':{'class': 'col-md-2'}}) }} {{ form_errors(form.nickname, {'attr': {'class': 'col-md-3'}}) }} </div> <div class="form-group"> {{ form_label(form.password, 'password', {'label_attr': {'class': 'col-md-1 control-label'}}) }} {{ form_widget(form.password, {'attr': {'class': 'col-md-2'}}) }} {{ form_errors(form.password, {'attr': {'class': 'col-md-3'}}) }} </div> <div class="form-group"> {{ form_label(form.password_repeat, 'Repeat password', {'label_attr': {'class': 'col-md-1 control-label'}}) }} {{ form_widget(form.password_repeat, {'attr':{'class': 'col-md-2'}}) }} {{ form_errors(form.password_repeat, {'attr': {'class': 'col-md-3'}}) }} </div> <div class="form-group"> <div class="col-md-1 control-label"> <input type="submit" value="submit"> </div> </div> </form> 

Есть идеи?

Вы должны добавить _token в свою форму, т.е.

 {{ form_row(form._token) }} 

На данный момент в вашей форме отсутствует поле токена CSRF. Если вы используете функции формы твига для визуализации вашей формы, например form(form) это автоматически отобразит поле маркера CSRF для вас, но ваш код показывает, что вы создаете форму с необработанным HTML как <form></form> , поэтому вы необходимо вручную отобразить поле.

Или просто добавьте {{ form_rest(form) }} перед закрывающим тегом формы.

Согласно документам

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

form_rest (просмотр, переменные)

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

Этот параметр в проблеме php.ini проблемы

 ; How many GET/POST/COOKIE input variables may be accepted max_input_vars = 1000 

Проблема в том, что _token пропускает запрос PUT (GET). Таким образом, вы можете увеличить значение.

Кроме того, это касается больших файлов. Увеличение

 upload_max_filesize 

опция решит проблему

Это происходит потому, что формы по умолчанию содержат CSRF-защиту, которая в некоторых случаях не нужна.

Вы можете отключить эту защиту CSRF в своем классе формы в методе getDefaultOptions следующим образом:

 // Other methods omitted public function getDefaultOptions(array $options) { return array( 'csrf_protection' => false, // Rest of options omitted ); } 

Если вы не хотите отключать защиту CSRF, вам необходимо отобразить поле защиты CSRF в вашей форме. Это можно сделать, используя {{ form_rest(form) }} в вашем файле вида, например:

 <form novalidate action="{{path('signup_index')}}" method="post" {{form_enctype(form)}} role="form" class="form-horizontal"> <!-- Code omitted --> <div class="form-group"> <div class="col-md-1 control-label"> <input type="submit" value="submit"> </div> </div> {{ form_rest(form) }} </form> 

{{ form_rest(form) }} отображает все поля, которые вы не ввели вручную.

Перед </form> поставьте:

 {{ form_rest(form) }} 

Он автоматически вставляет другие важные (скрытые) входы.

В дополнение к предложениям других вы можете получить ошибки токена CSRF, если хранилище сеансов не работает.

В недавнем случае мой коллега изменил «session_prefix» на значение, в котором было пробел.

 session_prefix: 'My Website' 

Это сломало хранилище сеансов, что, в свою очередь, означало, что моя форма не могла получить токен CSRF из сеанса.

Недавно у меня была эта ошибка. Оказывается, мои настройки cookie были неправильными в config.yml. Добавив параметры cookie_path и cookie_domain в framework.session он исправил это.

Если вы не хотите использовать form_row или form_rest и просто хотите получить доступ к значению _token в шаблоне ветки. Используйте следующее:

 <input type="hidden" name="form[_token]" value="{{ form._token.vars.value }}" /> 

В моем случае у меня возникла проблема с аннотацией maxSize в сущности, поэтому я увеличил ее с 2048 по 2004 год8.

  /** * @Assert\File( * maxSize = "20048k", * mimeTypes = {"application/pdf", "application/x-pdf"}, * mimeTypesMessage = "Please upload a valid PDF" * ) */ private $file; 

надеюсь, этот ответ поможет!

Если вы преобразовали форму из простого HTML в веточку, убедитесь, что вы не пропустили удаление закрывающего </form> . Глупая ошибка, но, как я выяснил, это возможная причина этой проблемы.

Когда я получил эту ошибку, я не мог понять это сначала. Я использую form_start() и form_end() для генерации формы, поэтому мне не нужно явно добавлять токен с form_row(form._token) или использовать form_rest() для его получения. Он должен был быть добавлен автоматически form_end() .

Проблема заключалась в том, что представление, с которым я работал, было тем, что я преобразовал из простого HTML в twig, и я пропустил удаление закрывающего </form> , поэтому вместо:

 {{ form_end(form) }} 

Я имел:

 </form> {{ form_end(form) }} 

Это похоже на то, что может form_end() ошибку, но, видимо, этого не происходит, поэтому, когда form_end() выводит form_rest() , форма уже закрыта. Фактически созданный источник страницы формы был следующим:

 <form> <!-- all my form fields... --> </form> <input type="hidden" id="item__token" name="item[_token]" value="SQAOs1xIAL8REI0evGMjOsatLbo6uDzqBjVFfyD0PE4" /> </form> 

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

У меня была эта проблема со странным поведением: очистка кеша браузера не исправила его, но очистка файлов cookie (то есть файлов cookie сеанса PHP) решила проблему.

Это нужно сделать после того, как вы проверили все другие ответы, в том числе проверив, что у вас есть токен в поле ввода скрытой формы.

Это кажется проблемой при использовании бутстрапа, если вы не визуализируете форму {{form (form)}}. Кроме того, проблемы возникают только при вводе типа = «скрытый». Если вы проверите страницу с формой, вы обнаружите, что скрытый ввод не является частью разметки вообще, или она отображается, но не представляется по какой-либо причине. Как было сказано выше, добавление {{form_rest (form)}} или перенос ввода, как показано ниже, должен сделать трюк.

 <div class="form-group"> <input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}"> </div>