在Yii框架中,为了防止csrf攻击,封装了CSRF令牌验证。
只需要在主配置文件中进行简单的配置,就可以实现CSRF的验证,但是默认的开启是整站开启,当有时候需要某些地方不要经过拦截时我们就可以用如下方式,此说明只针对Yii1.0有效。
要实现此方法需要要重写CHttpRequest类。
1. 在框架的framework/global/extensions/http/ 目录下新建一个WFilterHttpRequest类 继承创建一个类,继承于CHttpRequest,里面加入代码如下
/**
* 局部关闭CSRF
*/
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'));
}
} }
2. 然后再修改main.php
'components'=>array(
'request'=>array(
'class'=>'system.global.extensions.http.WFilterHttpRequest',
// Enable Yii Validate CSRF Token
'enableCsrfValidation' => true,
// Cookie攻击的防范
'enableCookieValidation'=>true,
// 不需要开启CSRF的控制器
'noCsrfValidationRoutes'=>array(
'Article',
'Cart',
'Confirmation',
'Item/AjaxLogin',
),
),
),
3.在noCsrfValidationRoutes 里面添加不需要过滤的控制器,注意的是我的控制器是ArticleController 以Controller结尾的,这里就不需要写Controller了,要想加入哪个action直接像上面写上即可
原创文章出处:极安全 www.jisec.com