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,
]);
}
Use this :
public function beforeAction($action)
{
$this->enableCsrfValidation = false;
return parent::beforeAction($action);
}
Do not disable CSRF
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/
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
You can use below configuration in your main config file to globally disable csrf validation in whole application.
$config = [
'components' => [
'request' => [
'enableCsrfValidation' => false,
],
],
];
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With