HttpException:400 无法验证您的数据提交

Posted

技术标签:

【中文标题】HttpException:400 无法验证您的数据提交【英文标题】:HttpException:400 Unable to verify your data submission 【发布时间】:2021-12-30 00:55:36 【问题描述】:

我的日志文件充满了这些错误

2021-11-19 12:39:42 [27.xxx.xxx.xxx][1958][gi96uqh6atadlbsg2ksjfltd9e][error][yii\web\HttpException:400] yii\web\BadRequestHttpException: Unable to verify your data submission. in /var/www/html/vendor/yiisoft/yii2/web/Controller.php:218

似乎无法弄清楚为什么。因为我也无法复制这个问题。

我有 read this,但该解决方案不适用于我,因为我的所有表单都是使用 $form = ActiveForm::begin([]) 创建的,而且我没有上传文件。

在我的<header> 我有这个

<meta name="csrf-param" content="_csrf-frontend">
<meta name="csrf-token" content="oidpfJVSR28kMxgD4loRdgIs3TCRVITuR6Ly3Z587nLxdgIt-h8XIlFbSECzCEgHUmqaQ9InwaIYzJ2u-ySaIw==">

因为我使用$form = ActiveForm::begin([]),所以我的表单有这个隐藏字段

<form id="form-small" action="/frontend/web/search/" method="post">
<input type="hidden" name="_csrf-frontend" value="oidpfJVSR28kMxgD4loRdgIs3TCRVITuR6Ly3Z587nLxdgIt-h8XIlFbSECzCEgHUmqaQ9InwaIYzJ2u-ySaIw==">

这是我的$form = ActiveForm::begin([])

$form = ActiveForm::begin([
        'id' => $model->formName().'-form-small',
        'action' => ['/search/default/id'],
        'method' => 'post',
        'scrollToError' => false,
        'validateOnChange' => false,
        'validateOnSubmit' => true,
        'enableClientValidation' => true,
        'enableAjaxValidation' => true,
        'fieldConfig' => [
            'options' => [
                'tag' => false,
            ],
        ],
    ]);

我的页脚中也有这个 JS。 (main.php 布局)

<script>
    $.ajaxSetup(
      headers: 
        'X-CSRF-TOKEN': '<?= \yii::$app->request->csrfToken ?>'
      
    );
</script>

我也想关闭 CSRF。

在我的main.php 我有这个

 'request' => [
            'csrfParam' => '_csrf-frontend',
            'enableCsrfCookie' => false, 
            'enableCookieValidation' => true,
            'cookieValidationKey' => 'frontend-cookie-2021',
        ],

我编辑了yii/framework/web/Request.php

并在 841

行之前添加以下代码
echo ' -- start--';
        echo '<br><br><br>';
        print_r($trueToken); 
        echo '<br><br><br>';
print_r($this->getBodyParam($this->csrfParam));
echo '<br><br><br>';
print_r($this->getCsrfTokenFromHeader());
echo '<br><br><br>'; 
echo ' -- end--';
die;

每次我提交我的表格。 $trueToken 令牌似乎有所不同。即使我不刷新页面。

如下图

-- start--
S-r869794GPYBi8voh-dXVDFLLWl8GvWhw6Qvn4c7icYu5e6sbCwLq1uf2zzTcQsAINrxuaDLprYYP_NG0Sadg==

b4GMJgf6dmn8H64oljr6uxokFC2WbQeLP4bY_SI-7Pg80Od3aLcmJIl3_mvHaKPKSmJTXtUeQsdg6LeOR2aYqQ==

b4GMJgf6dmn8H64oljr6uxokFC2WbQeLP4bY_SI-7Pg80Od3aLcmJIl3_mvHaKPKSmJTXtUeQsdg6LeOR2aYqQ==
-- end--

知道如何解决这个问题吗?谢谢。

【问题讨论】:

这能回答你的问题吗? Why get Unable to verify your data submission error in Yii2? - 我猜你需要用表单发送 CSRF 令牌,因此它需要是一个隐藏的输入字段 @Johannes 使用$form = ActiveForm::begin([]) 确实在我的表单中添加了一个隐藏字段。并且crsf代码也和header一样。 您是通过submit 按钮还是通过AJAX 发送这些表单?另外,你可以尝试在Yii2的Controller.php文件中var_dump($this-&gt;request-&gt;validateCsrfToken())var_dump(Yii::$app-&gt;getErrorHandler()-&gt;exception);并在这里分享输出吗? (见github.com/yiisoft/yii2/blob/…) 基于您最新编辑的补充:如果实际发送了 X-CSRF-TOKEN 标头,您能否检查浏览器开发者控制台的 Network 选项卡? @Johannes var_dump($this-&gt;request-&gt;validateCsrfToken()) 给了我一个truevar_dump(Yii::$app-&gt;getErrorHandler()-&gt;exception); 给了我一个 null 是的 X-CSRF_TOKEN 标头已发送 X-CSRF-Token EdbyZ-n6FWx-tYTlt-Yvr_PxaFpEAVeAH4FPGnBpIwlCh5k2hrdFIQvd1KbmtHbeo7cvKQdyEsxA7yBpFTFXWA== X-Requested-With XMLHttpRequest 【参考方案1】:

CSRF 令牌标头名称为 X-CSRF-Token

https://github.com/yiisoft/yii2/blob/552593ca3bcd9b4c9b19913e9e56de9548db59e3/framework/web/Request.php#L103

获取已经生成的令牌

$.ajaxSetup(
  headers: 
    'X-CSRF-Token': $('meta[name="_csrf-frontend"]').attr('content')
  
);

【讨论】:

const getCsrfToken = () =&gt; $('meta[name="_csrf-frontend"]').attr('content');

以上是关于HttpException:400 无法验证您的数据提交的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 Yii2 中出现无法验证您的数据提交错误?

付款时银行无法验证您的 VISA

无法验证您的应用程序,也无法通过 Application Loader 上传

Xcode 8.2.1 无法验证您的应用程序

Firebase 托管:我们无法验证您的域 example.com。请检查您的设置并重试[关闭]

无法打开与您的身份验证代理的连接