Yii 2 局部关闭 CSRF 拦截

最近在拿 yii 2.0 开发微信公众平台,在微信 post 请求接口时,没有返回数据,于是查询 yii 错误日志,发现错误为

exception ‘yiiwebBadRequestHttpException’ with message ‘Unable to verify your data submission

于是查看源代码,yii 2.0 在 我们继承的顶级 controller 中,有下列属性

/**
 * @var boolean whether to enable CSRF validation for the actions in this controller.
 * CSRF validation is enabled only when both this property and [[Request::enableCsrfValidation]] are true.
*/
 public $enableCsrfValidation = true;

106 行的 beforeAction 内,对他做了处理

``` public function beforeAction($action) { if (parent::beforeAction($action)) { if ($this->enableCsrfValidation && Yii::$app->getErrorHandler()->exception === null && !Yii::$app->getRequest()->validateCsrfToken()) { throw new BadRequestHttpException(Yii::t('yii', 'Unable to verify your data submission.')); } return true; } else { return false; } }

```

于是找到错误原因:

yii 2.0 内,对 CSRF 攻击做了处理,会对 post 提交的数据做 token 验证,而微信 post 到我们服务器的代码中,没有带上这个 token ,所以会验证失败

解决方法:

1、在我们的控制器里面,加上这行属性,设置为 false

public $enableCsrfValidation = false;

你还可以直接修改顶层控制器的 $enableCsrfValidation ,但是不推荐这样做!


如需转载,请注明出处: https://chadou.me/p/158

最新发布