• Unable to verify your data submission.加入了_csrf也报400错误的解决


    <input type="hidden" name="_csrf" value="<?=Yii::$app->request->csrfToken?>" />
    如果你添加了以上标签还是报错那么你需要坚持看完这篇文档

    刚开始做Yii2开发的程序猿基本上都遇到过这个错误,因为在程序设计中避免不了的要向服务器提交数据,那就需要使用到表单。
    其实这个错误的提示很明确的其中文错误就是提交的数据验证不通过。我们下来分析导致这个错误的原因。 导致了这个错误的原因是Yii2框架本身的安全机制需要在提交表单时验证CSRF,为了防止CSRF攻击,这对于数据的安全性和防止表单的重复提交时很好也是很简单的一种解决方案。

    下边是常规的解决方案:

    1.在form标签中添加<input type="hidden" name="_csrf" value="<?=Yii::$app->request->csrfToken?>" />

    2.在控制器开始部分添加public $enableCsrfValidation false;

    相信第二种方法一定能够解决问题,但是不安全。你关了CSRF后相当于少了一层安全机制。但是使用第一种方法添加了隐藏标签不一定能够成功,这是为什么呢?让我们仔细分析。

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

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

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

    二、如何约定CSRF的变量名

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

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

    在配置文件中如果有request的配置那么我们就可以配置CSRF的变量名了例如在我的程序中配置的变量名是_csrf-frontend那么在添加form隐藏标签时就需要和这儿的配置一致

    三、如何解决

    打开APP中的配置文件查看request配置中的'csrfParam' => '_csrf-frontend',在视图中的隐藏input的name应该和csrfParam设置的值相同。

    如果csrfParam设置的值为_csrf_frontend那么你的input隐藏标签需要这样写:

    <input name="_csrf-frontend" type="hidden" value="<?= Yii::$app->request->csrfToken ?>"/>
  • 相关阅读:
    一天一个算法:将一个数组中的值按逆序输出
    一天一个算法:求俩个数的最大公约数和最小公倍数
    一天一个算法:给出年、月、日,计算该日是该年的第几天
    一天一个算法:递归计算函数
    一天一个算法:冒泡排序算法
    一天一个算法:猴子吃桃问题
    一天一个算法:求Sn=a+aa+aaa+…+aa…a之和
    一天一个算法:完数
    一天一个算法:水仙花数
    一天一个算法:前言
  • 原文地址:https://www.cnblogs.com/fpcing/p/7569777.html
Copyright © 2020-2023  润新知