Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

php

yii

yii2

My yii2 application was working fine till yesterday however today on submiting form it is showing error. "Bad Request (#400) Unable to verify your data submission.".

I found many such questions on stackoverflow, where people are suggesting to disable csrf validation i tried disabling csrf validation also. i even updated my composer still it is not working.

please suggest any other possible solution.

This is my form code :-

<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();
                  ?>

and this is my action code inside controller:-

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,
    ]);
}
like image 396
Ninja Turtle Avatar asked Jul 11 '16 05:07

Ninja Turtle


4 Answers

Use this :

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

Do not disable CSRF

like image 102
Insane Skull Avatar answered Nov 07 '22 17:11

Insane Skull


I'm using the advanced template and ran into this issue. After much head banging I noticed the _csrf meta tag used in yii's baked in forms was named "_csrf-frontend" (on the frontend of course). Also the request cookie was named the same.

Provided the header in your layout is registering the meta tag

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

Submit _csrf with the same name as the meta tag in your ajax. Yii provides helper for this also

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

Quick example:

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

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

Helpful info here: https://yii2-cookbook-test.readthedocs.io/csrf/

like image 27
Steven McElveen Avatar answered Nov 07 '22 15:11

Steven McElveen


There are two ways you can try. First increase post_max_size size in php.ini. Second run composer update and clear cookie as follow: - composer self-update - composer update - clear cookie

like image 3
jai3232 Avatar answered Nov 07 '22 17:11

jai3232


You can use below configuration in your main config file to globally disable csrf validation in whole application.

$config = [
    'components' => [
        'request' => [
            'enableCsrfValidation' => false,
        ],
    ],
];
like image 2
curious_pawn Avatar answered Nov 07 '22 17:11

curious_pawn