web-dev-qa-db-fra.com

Yii2 - Mauvaise demande (# 400) Impossible de vérifier votre soumission de données

Ma demande yii2 fonctionnait bien jusqu'à hier, mais aujourd'hui, lors de la soumission du formulaire, elle montre une erreur. "Mauvaise demande (# 400) Impossible de vérifier votre soumission de données.".

J'ai trouvé beaucoup de ces questions sur stackoverflow, où les gens suggèrent de désactiver la validation csrf, j'ai également essayé de désactiver la validation csrf. j'ai même mis à jour mon composer toujours ça ne fonctionne pas.

veuillez suggérer toute autre solution possible.

Voici mon code de formulaire: -

<h2>Open an Account</h2>
                  <?php
                    $form = ActiveForm::begin([
                            'id' => 'live-account-form',
                            'enableClientValidation' => true,
                            'fieldConfig' => [
                                'template' => '{input}{error}',
                                'options' => [
                                    'tag' => false,
                                ]
                            ],
                            'options' => [
                                'class' => 'form-horizontal'
                            ]
                        ]);
                  ?>

                  <div class="form-group">
                    <label for="signupform-first_name" class="col-sm-3 control-label">First Name*</label>
                    <div class="col-sm-9 field-signupform-first_name">
                        <?= $form->field($model, 'first_name')->textInput(['placeholder' => "Enter First Name"]) ?>  

                    </div>
                  </div> 

                  <div class="form-group">
                    <label for="singupform-last_name" class="col-sm-3 control-label">Last Name*</label>
                    <div class="col-sm-9 field-signupform-last_name">
                        <?= $form->field($model, 'last_name')->textInput(['placeholder' => 'Enter Last Name']) ?> 
                    </div>
                  </div>   

                  <div class="form-group">
                    <label for="signupform-email" class="col-sm-3 control-label">Email*</label>
                    <div class="col-sm-9 field-signupform-email">
                        <?= $form->field($model, 'email')->textInput(['placeholder' => "Enter Email Address"]) ?>
                    </div>
                  </div>

                  <div class="form-group">
                    <label for="signupform-country" class="col-sm-3 control-label">Country*</label>
                    <div class="col-sm-9 field-signupform-country">
                        <?= $form->field($model, 'country')->dropDownList(
                            ArrayHelper::map(PhCountry::find()->all(), 'intid', 'country_name'),
                            [
                                'Prompt' => 'Select Country',
                                'onchange' => '$( "select#signupform-country_code" ).html("showLoading");
                                    $.get( "index.php/site/fetch-country-code?id='.'"+$(this).val(), 
                                    function(data) {
                                        $( "#signupform-country_code" ).val(data);
                                    });'
                            ]
                        ) ?>
                    </div>
                  </div>

                  <div class="form-group">
                      <label class="col-sm-3 control-label">Phone Number*</label>
                      <div class="col-sm-9 phone-number-div">
                        <div>
                        <?= $form->field($model, 'country_code')->textInput(['placeholder' => 'Code', 'class' => 'country-code form-control']) ?>
                        </div>
                        <div class="field-signupform-phone">
                        <?= $form->field($model, 'phone')->textInput(['placeholder' => 'Enter Phone Number', 'class' => 'enter-phone-number form-control']) ?>
                        </div>
                      </div>
                    </div>

                    <button type="submit" class="btn btn-default">Create Account</button>
                  <?php
                    ActiveForm::end();
                  ?>

et voici mon code d'action à l'intérieur du contrôleur: -

public function actionIndex()
{
    Yii::$app->controller->enableCsrfValidation = false;
    $model = new SignupForm();
    if ($model->load(Yii::$app->request->post())) {
        //print_r($model);
        if ($user = $model->signup()) {
            if($model->sendRegistrationEmail($user)) {
                Yii::$app->session->setFlash('emailSent', 'An email containing confirmation link is sent to your email Address.');
                if (Yii::$app->getUser()->login($user)) {
                    return $this->goHome();
                }    
            } 
        }
        //exit;
    }

    return $this->render('index', [
        'model' => $model,
    ]);
}
14
Vinit Singh

Utilisez ceci :

public function beforeAction($action) 
{ 
    $this->enableCsrfValidation = false; 
    return parent::beforeAction($action); 
}

Ne désactivez pas CSRF

22
Insane Skull

J'utilise le modèle avancé et j'ai rencontré ce problème. Après beaucoup de coups, j'ai remarqué que la balise meta _csrf utilisée dans les formes cuites de yii était nommée "_csrf-frontend" (sur le frontend bien sûr). Le cookie de requête a également été nommé de la même manière.

À condition que l'en-tête de votre mise en page enregistre la balise META

<?php $this->registerCsrfMetaTags() ?>

Soumettez _csrf avec le même nom que la balise meta dans votre ajax. Yii fournit également une aide pour cela

<?=Yii::$app->request->csrfParam?>

Exemple rapide:

var postData = {
   someparam : somevalue,
   '<?=Yii::$app->request->csrfParam?>': '<?=Yii::$app->request->getCsrfToken()?>'
}

$.ajax({
    type: 'post',
    data: postData,
    url: dataURL,
})

Informations utiles ici: https://yii2-cookbook-test.readthedocs.io/csrf/

2
Steven McElveen

Vous pouvez essayer de deux manières. Augmentez d'abord la taille de post_max_size dans php.ini. Deuxième exécution composer mise à jour et effacer le cookie comme suit: - composer auto-mise à jour - composer mise à jour - effacer le cookie)

2
jai3232

Vous pouvez utiliser la configuration ci-dessous dans votre fichier de configuration principal pour désactiver globalement la validation csrf dans toute l'application.

$config = [
    'components' => [
        'request' => [
            'enableCsrfValidation' => false,
        ],
    ],
];
2
Dhruten