解决POST数据时因启用Csrf出现的400错误 [ 2.0 版本 ]
第一种解决办法是关闭Csrf
public function init(){
$this->enableCsrfValidation = false;
}
第二种解决办法是在form表单中加入隐藏域
<input name="_csrf" type="hidden" id="_csrf" value="<?= Yii::$app->request->csrfToken ?>">
第三种解决办法是在AJAX中加入_csrf字段
var csrfToken = $('meta[name="csrf-token"]').attr("content");
$.ajax({
type: 'POST',
url: url,
data: {_csrf:csrfToken},
success: success,
dataType: dataType
});
qq3737002 河南郑州
注册时间:2015-03-29
最后登录:2022-07-04
在线时长:59小时26分
最后登录:2022-07-04
在线时长:59小时26分
- 粉丝31
- 金钱4498
- 威望170
- 积分6788
共 10 条评论
哦哦, 也就是说只要开启了crsf验证的话,就得在前台页面上有一个 类似这样的表单数据提交给后台,YII会进行匹配
<input type="hidden" value="dWl3LW1IbU0cHA14VHwufCQvTmk9flV1REREZQUwFDomMRpDCTEhYA==" name="_csrf">
能不能说下,Yii这个匹配的过程,
Yii::$app->request->csrfToken
这个值存储在哪里的,怎么匹配的?存储位置
protected function createCsrfCookie($token) { $options = $this->csrfCookie; $options['name'] = $this->csrfParam; $options['value'] = $token; return new Cookie($options); }
校验方法
public function validateCsrfToken($token = null) { $method = $this->getMethod(); // only validate CSRF token on non-"safe" methods http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.1 if (!$this->enableCsrfValidation || in_array($method, ['GET', 'HEAD', 'OPTIONS'], true)) { return true; } $trueToken = $this->loadCsrfToken(); if ($token !== null) { return $this->validateCsrfTokenInternal($token, $trueToken); } else { return $this->validateCsrfTokenInternal($this->getBodyParam($this->csrfParam), $trueToken) || $this->validateCsrfTokenInternal($this->getCsrfTokenFromHeader(), $trueToken); } }
如果第二种 如果有很多输入框 那是不是要写很多个隐藏域??累死
@xyf90314 一个表单一个
Yii::$app->request->csrfToken
产生新的cookie csrf,那从前台传到后台它是怎么个验证流程,能跟我讲讲原理么?我按照上述操作post 加了csrfToke,ajax还是报400错误
需要在header中设置X-CSRF-Token
我也按照你们的方法都试了还是不行 但是我又不想关csrf
你确定你写对了
@一人在行走 一直在用
非常感谢楼主的帖子,我正好遇到这个问题,一直不知道什么原因。看到之后明白了!万分感谢,为了给您点赞回复,专门注册了一个账号!再次表示感谢
已经试过禁用csrf,但还是报404是为什么呢?
页面未找到 跳转错误了吧
刚看到楼主的帖子,使用第二种方法,刚开始试是不行的,需要将input标签的name值设置成跟APP的request组件的csrfParam值一样才能起作用
眼一下......
很难受,这个问题困扰了很久。第三个方法是最开始用的,但是没起作用,不知道什么原因。
最终用第一个方法解决了。在控制器里定义
$enableCsrfValidation=false
。你可以看看是不是你的配置里修改了
request
组件中的csrfParam
的名称后面两种方法具体实现可参考Yii.js文件