class HttpRequest extends CHttpRequest
{
public $noCsrfValidationRoutes=array();
protected function normalizeRequest()
{
//attach event handlers for CSRFin the parent
parent::normalizeRequest();
//remove the event handler CSRF if this is a route we want skipped
if($this->enableCsrfValidation)
{
$url=Yii::app()->getUrlManager()->parseUrl($this);
foreach($this->noCsrfValidationRoutes as $route)
{
if(strpos($url,$route)===0)
Yii::app()->detachEventHandler('onBeginRequest',array($this,'validateCsrfToken'));
}
}
}
}
public function beforeAction($action)
{
Yii::$app->request->enableCsrfValidation = $action->id !== 'index'; //action name to disable CSRF for
return parent::beforeAction($action);
}
<?php
class HttpRequest extends CHttpRequest
{
public $noCsrfValidationRoutes=array();
public function validateCsrfToken($event) {
$url=Yii::app()->getUrlManager()->parseUrl($this);
foreach($this->noCsrfValidationRoutes as $route)
{
if(strpos($url,$route)===0)
return true;
}
return parent::validateCsrfToken($event);
}
}
8条答案
按热度按时间vwkv1x7d1#
CSRF验证发生在加载网页的早期,甚至在调用控制器之前。您希望覆盖CHttpRequest类,以告诉它忽略某些路由。
在
protected/components
文件夹中创建一个名为HttpRequest.php
的文件,并添加以下内容。然后,使用以下信息编辑
protected/config
中的配置文件:axkjgtzd2#
要禁用CSRF,请将以下代码添加到您的控制器:
czq61nw13#
顾名思义,它是 * 跨站点请求伪造 *,因此它不是跨域的,而且必须不是:)
CSRF已在请求组件中启用,因此只需获取请求组件并重新配置即可:
我不太确定该把它放在哪里,可能是在行动开始的时候。
0wi1tuuw4#
从控制器禁用CSRF:
请访问:https://yii2-cookbook.readthedocs.io/csrf/#disabling-csrf-protection
nkcskrwz5#
要禁用csrf,请将其添加到main.php中
7cwmlq896#
要禁用CSRF,请将以下代码添加到您的控制器:
bhmjp9jg7#
下面是另一种针对某些操作禁用它的方法
lo8azlld8#
我的做法与willem-renzema的方法略有不同。
配置它与他的答案相同,但他的方法给了我错误,因为在
normalizeRequest()
函数中,并不总是可以用$url=Yii::app()->getUrlManager()->parseUrl($this);
获得url。