我的日志文件充满了这些错误
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
Run Code Online (Sandbox Code Playgroud)
似乎无法弄清楚为什么。因为我也无法复制这个问题。
我已阅读此内容,但该解决方案不适用于我,因为我的所有表单都是使用创建的$form = ActiveForm::begin([]),并且我没有上传文件。
在我的<header>我有这个
<meta name="csrf-param" content="_csrf-frontend">
<meta name="csrf-token" content="oidpfJVSR28kMxgD4loRdgIs3TCRVITuR6Ly3Z587nLxdgIt-h8XIlFbSECzCEgHUmqaQ9InwaIYzJ2u-ySaIw==">
Run Code Online (Sandbox Code Playgroud)
因为我使用$form = ActiveForm::begin([]),对于我的表单有这个隐藏字段
<form id="form-small" action="/frontend/web/search/" method="post">
<input type="hidden" name="_csrf-frontend" value="oidpfJVSR28kMxgD4loRdgIs3TCRVITuR6Ly3Z587nLxdgIt-h8XIlFbSECzCEgHUmqaQ9InwaIYzJ2u-ySaIw==">
Run Code Online (Sandbox Code Playgroud)
这是我的$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,
],
],
]);
Run Code Online (Sandbox Code Playgroud)
我的页脚中也有这个 JS。(main.php布局)
<script>
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': '<?= \yii::$app->request->csrfToken ?>'
}
});
</script>
Run Code Online (Sandbox Code Playgroud)
我也不想关闭 CSRF。
在我的main.php我有这个
'request' => [
'csrfParam' => '_csrf-frontend',
'enableCsrfCookie' => false,
'enableCookieValidation' => true,
'cookieValidationKey' => 'frontend-cookie-2021',
],
Run Code Online (Sandbox Code Playgroud)
我编辑了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;
Run Code Online (Sandbox Code Playgroud)
每次我提交表格时。令牌$trueToken似乎不同。即使我不刷新页面。
像下面这样
-- start--
S-r869794GPYBi8voh-dXVDFLLWl8GvWhw6Qvn4c7icYu5e6sbCwLq1uf2zzTcQsAINrxuaDLprYYP_NG0Sadg==
b4GMJgf6dmn8H64oljr6uxokFC2WbQeLP4bY_SI-7Pg80Od3aLcmJIl3_mvHaKPKSmJTXtUeQsdg6LeOR2aYqQ==
b4GMJgf6dmn8H64oljr6uxokFC2WbQeLP4bY_SI-7Pg80Od3aLcmJIl3_mvHaKPKSmJTXtUeQsdg6LeOR2aYqQ==
-- end--
Run Code Online (Sandbox Code Playgroud)
知道如何解决这个问题吗?谢谢。
CSRF 令牌标头名称是X-CSRF-Token
获取已经生成的令牌
$.ajaxSetup({
headers: {
'X-CSRF-Token': $('meta[name="_csrf-frontend"]').attr('content')
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
989 次 |
| 最近记录: |