火舰 2015-07-13 11:41:03 19475次浏览 3条评论 14 4 0

提交表单报400错误,提示 “您提交的数据无法验证”
原来是csrf验证的问题,因为表单是自己写的,在Yii框架中,为了防止csrf攻击,对post的表单数据封装了CSRF令牌验证。
解决办法关闭csrf验证
方法一、在配资文件中关闭

'components'=>array(
        'request'=>array(
            // Enable Yii Validate CSRF Token
            'enableCsrfValidation' => true,
        ),
),

使用Yii表单生成页面的时候,如果表单的提交方式为POST,是都会在页面中添加一个隐藏字段,这个隐藏字段就是CSRF令牌验证字段
用户在提交表单的同时,将该字段提交给服务器端,Yii框架会将该有客户端提交过来的隐藏字段和客户端提交过来的Cookie中的YII_CSRF_TOKEN值进行比较。
相同则通过继续执行,不相同则会抛出400异常:"The CSRF token could not be verified."。
所以就出现了上面的问题,如果是自己写的表单,可以在视图页面的表单添加隐藏的令牌验证字段
方法二、在表单中增加隐藏的验证字段

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

如果不想csrf验证就将方法一的true修改为false,这样YII就不会做post表单验证处理。

觉得很赞
  • 评论于 2016-03-13 17:47 举报

    这个火舰牛逼,赞一个。

    觉得很赞
  • 评论于 2016-04-13 20:18 举报

    我也遇到了这个错误,赞一个

  • 评论于 2017-04-27 01:56 举报

    JS获取csrf

    var csrfToken = '<?php echo  Yii::$app->request->csrfToken ?>
    

    在AJAX的数据中添加csrf:

    'data':{'num':num,'productid':productid,'_csrf':csrfToken},
    

    这样写即可,这样控制器就能收到csrf数据了。

    觉得很赞
您需要登录后才可以评论。登录 | 立即注册