Yii2局部关闭CSRF拦截防范策略(api接口等)

  •   
  • 3557
  • PHP
  • 1
  • super_dodo
  • 2015/11/06

最近在拿yii2开发微信公众平台接口,在微信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; 
	} 
}

于是找到错误原因:yii2.0内,对 CSRF 攻击做了处理,会对 post 提交的数据做 token 验证,而微信 post 到我们服务器的代码中,没有带上这个 token ,所以会验证失败。

解决方法:

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

public $enableCsrfValidation = false;

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

从Yii2的Request看其CSRF防范策略(yii2-csrf-yii-request)

但平庸的我们,也许的确无法在某个领域登峰造极,达到处于金字塔尖的1%,但经过努力和奋斗,迈入这个领域的10%,还是轻而易举的。毕竟,以大多数人努力程度之低,根本轮不到去拼天赋。