Недействительный 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>
Какие могут быть причины этой проблемы и как ее можно решить?
5 ответ(ов)
Вы можете столкнуться с данной ошибкой, если ваша форма содержит много элементов. Проблема вызвана настройкой в файле php.ini:
; Максимальное количество переменных GET/POST/COOKIE, которые могут быть приняты
max_input_vars = 1000
Если поле _token
отсутствует в запросе PUT (или GET), вам необходимо увеличить это значение.
Также это касается больших файлов. Увеличение параметра:
upload_max_filesize
решит вашу проблему.
Это происходит потому, что формы по умолчанию содержат защиту от CSRF, которая не всегда необходима в некоторых случаях.
Вы можете отключить эту защиту от CSRF в вашем классе формы в методе getDefaultOptions
, вот так:
// Другие методы опущены
public function getDefaultOptions(array $options)
{
return array(
'csrf_protection' => false,
// Остальные параметры опущены
);
}
Если вы не хотите отключать защиту от CSRF, вам нужно отобразить поле защиты CSRF в вашей форме. Это можно сделать, используя {{ form_rest(form) }}
в вашем шаблоне, вот так:
<form novalidate action="{{ path('signup_index') }}" method="post" {{ form_enctype(form) }} role="form" class="form-horizontal">
<!-- Код опущен -->
<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) }}
Это автоматически вставит другие важные (скрытые) поля ввода.
У меня была проблема с странным поведением: очищение кэша браузера не решило проблему, но удаление куки (то есть куки с ID сессии PHP) действительно помогло.
Это следует сделать после того, как вы проверили все другие ответы, включая подтверждение того, что у вас действительно есть токен в скрытом поле ввода формы.
В дополнение к предложениям других пользователей, вы можете столкнуться с ошибками токена CSRF, если ваше хранилище сессий не работает.
Недавно мой коллега изменил значение session_prefix
, добавив пробел. Например:
session_prefix: 'My Website'
Это привело к сбою хранилища сессий, в результате чего моя форма не могла получить токен CSRF из сессии.
symfony2 - как переключиться с "dev" на "prod"?
Функции startsWith() и endsWith() в PHP
Как получить расширение файла в PHP?
Как читать большой файл построчно?
Почему нельзя вызывать абстрактные функции из абстрактных классов в PHP?