0

Недействительный CSRF-токен. Пожалуйста, попробуйте отправить форму снова.

9

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

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 ответ(ов)

0

Вы можете столкнуться с данной ошибкой, если ваша форма содержит много элементов. Проблема вызвана настройкой в файле php.ini:

; Максимальное количество переменных GET/POST/COOKIE, которые могут быть приняты
max_input_vars = 1000

Если поле _token отсутствует в запросе PUT (или GET), вам необходимо увеличить это значение.

Также это касается больших файлов. Увеличение параметра:

upload_max_filesize

решит вашу проблему.

0

Это происходит потому, что формы по умолчанию содержат защиту от 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) }} рендерит все поля, которые вы не добавили вручную.

0

Перед тегом </form> добавьте:

{{ form_rest(form) }}

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

0

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

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

0

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

Недавно мой коллега изменил значение session_prefix, добавив пробел. Например:

session_prefix: 'My Website'

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь