yii2 - Как исправить неверный запрос (#400) Не удалось проверить отправку данных?

У меня есть контроллер, сгенерированный Gii. Я изменяю поведение, чтобы оно было таким:

public function behaviors()
{
    return [
        'verbs' => [
            'class' => VerbFilter::className(),
            'actions' => [
                'delete' => ['post'],
            ],
        ],
        'access' => [
            'class' => AccessControl::className(),
            'rules' => [
                [
                    'allow' => true,
                    'roles' => ['@'],
                ],
            ],
        ],
    ];
}

Когда я заполняю форму и отправляю ее, иногда я получаю сообщение об ошибке

Bad Request (#400) Unable to verify your data submission

Но если я нажму кнопку «Назад» в своем браузере и снова отправлю форму с тем же значением, все будет в порядке и будет успешно отправлено.

Я искал в google и stackoverflow, многие из них говорят, что проблема в токене CSRF. Но в моем макете я поставил <?= Html::csrfMetaTags() ?>, а в моей форме есть <input type="hidden" name="_csrf" value="...">

Кто-нибудь здесь может помочь мне решить эту проблему? И объясните, почему это происходит?


person Wilianto Indrawan    schedule 25.07.2015    source источник
comment
Вы загружаете какой-нибудь файл?   -  person Ivan Buttinoni    schedule 25.07.2015
comment
Нет .. только текстовое поле, ввод текста, выбор и флажок.   -  person Wilianto Indrawan    schedule 25.07.2015
comment
csrf зависит от времени, можете ли вы проверить часы (сервер и браузер)?   -  person Ivan Buttinoni    schedule 25.07.2015
comment
@IvanButtinoni Я не думаю, что токен csrf Yii2 основан только на сеансе или файлах cookie. Ему плевать на время. В этом случае мы должны: 1. Проверить, действительно ли вы отправили токен csrf. 2. Куки или сессия работают нормально?   -  person Ngô Văn Thao    schedule 27.07.2015
comment
Время @IvanButtinoni в моем браузере совпадает со временем на моем сервере.   -  person Wilianto Indrawan    schedule 27.07.2015
comment
@NgôVănThao да, токен отправляется с данными, и сеанс работает нормально для сеанса входа в систему.   -  person Wilianto Indrawan    schedule 27.07.2015
comment
что делает проверка csrf? хорошо ли его отключать?   -  person MeV    schedule 08.04.2016


Ответы (2)


добавить в форму в поле зрения

<input type="hidden" name="_csrf" value="<?=Yii::$app->request->getCsrfToken()?>" />
person Knase    schedule 01.09.2016

У меня была такая же проблема, и в итоге я отключил проверку csrf.

public function actionCreate() {
    Yii::$app->controller->enableCsrfValidation = false;
}

Это, казалось, сделало это для меня.

person Marios Frixou    schedule 03.09.2015
comment
Это метод проверки для предотвращения кросс-браузерных атак. Если у вас нет какой-либо важной информации в вашем запросе на публикацию/получение, ее можно безопасно отключить... - person Marios Frixou; 08.04.2016
comment
он должен быть общедоступным $enableCsrfValidation = false; - person Mosiur; 14.02.2017