【问题标题】:yii2 - How to solve Bad Request (#400) Unable to verify your data submission?yii2 - 如何解决错误请求 (#400) 无法验证您的数据提交?
【发布时间】:2015-10-15 20:00:09
【问题描述】:

我有一个 Gii 生成的控制器。我将行为修改为:

public function behaviors()
{
    return [
        'verbs' => [
            'class' => VerbFilter::className(),
            'actions' => [
                'delete' => ['post'],
            ],
        ],
        'access' => [
            'class' => AccessControl::className(),
            'rules' => [
                [
                    'allow' => true,
                    'roles' => ['@'],
                ],
            ],
        ],
    ];
}

当我填写表格并提交时,有时会出现错误

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

但是,如果我在浏览器中单击后退按钮并再次重新提交具有相同值的表单,则可以成功提交。

我一直在google和stackoverflow上搜索,很多人说问题出在CSRF Token上。但在我的布局中,我输入了<?= Html::csrfMetaTags() ?>,而在我的表单中,则是<input type="hidden" name="_csrf" value="...">

这里有人可以帮我解决这个问题吗?并解释为什么会这样?

【问题讨论】:

  • 你上传文件了吗?
  • No.. 只有文本区域,输入文本,选择 dan 复选框。
  • csrf 是时间相关的,你能检查你的时钟(服务器和浏览器)吗?
  • @IvanButtinoni 我不这么认为,在 Yii2 csrf 令牌中只是基于会话或 cookie。它不关心时间。在这种情况下,我们应该: 1. 检查您是否真的提交了 csrf 令牌。 2. Cookie 或会话工作正常吗?
  • @IvanButtinoni 在我的浏览器中的时间与在我的服务器中的时间相同。

标签: php yii2 bad-request


【解决方案1】:

在视图中添加表单

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

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,最终禁用了 csrf 验证。

    public function actionCreate() {
        Yii::$app->controller->enableCsrfValidation = false;
    }
    

    这似乎对我有用。

    【讨论】:

    • 是一种防止跨浏览器攻击的验证方法。如果您的 post/get 请求中没有任何重要信息,那么禁用它是安全的......
    • 应该是公开的 $enableCsrfValidation = false;
    猜你喜欢
    • 2015-09-27
    • 2017-06-20
    • 1970-01-01
    • 2021-12-30
    • 2014-12-15
    • 2017-02-12
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多