yii框架提交form表单时报400错误( Unable to verify your data submission.)几种解决方式

一、就是网络上最普遍的解决方式,将csrf关闭,这样就不会报错了,关闭的方式有两种。

        1.在配置文件advanced\frontend\config\main-local.php中进行修改配置"enableCsrfValidation"=false;

这种方法是针对于全局来解决的。

                2. 就是在当前访问控制器下修改一个属性来修改配置,

public $enableCsrfValidation = false;

                    这种是针对于局部来说的,也就是说只对当前控制器有效。

二、第二种方式就是在form表单中添加,在这里小编要提示一下了,无论是哪种验证方式,都必须要使用post提交,不然是不会通过验证的。

        <input type="hidden" name="_csrf" value="<?=Yii::$app->request->csrfToken?>" /> 

     这种也是最常规的一种解决方式。也可以解决,与第一种方法不同的是这种方法时将

三、第三种就是使用ajax方式进行传值,将token值也传值到指定页面。

var csrfToken = $('meta[name="csrf-token"]').attr("content");
$.ajax({
  type: 'post',
  url: url,
  data: {_csrf:csrfToken},
  dataType: dataType
  success:success
});

四、如果在使用了第二三种方法的后还是不可以,那么我们来仔细分析一下。

一、yii2框架如何获取CSRF进行验证

我们再方法中并没有手动接受CSRF的值进行验证,那么这一部分是由框架自己来完成的,框架自己来完成就会面临一个问题。你在回传CSRF时对于这个值保存在什么变量中就需要有个统一的约定,不然你传入的是name="_csrf"但是框架接收时是$_POST['csrf-token'](举例而已)那么框架永远接收不到你的值也就没有办法验证通过。

而这一部分是由yii2中的request来完成的。

二、如何约束csrf的变量名

我们知道CSRF验证是由request组件来完成的,而且我们知道yii2的组件都是可以单独配置的,那么我们打开配置文件。

'components' => [
    'request' => [
        'csrfParam' => '_csrf',
    ],

在配置文件中如果有request的配置那么我们就可以配置csrf的变量名了。

例如在我的程序中配置的变量名是_csrf那么在添加form隐藏标签时就需要和这儿的配置一致,切记,必须一致。

猜你喜欢

转载自blog.csdn.net/qq_41718455/article/details/80664439