现在的位置: 首页 > 编程开发 > Php > 编程开发 > 正文

Yii1.1实现局部关闭CSRF拦截

2015年12月14日 Php, 编程开发 ⁄ 共 1110字 ⁄ 字号 暂无评论

在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

给我留言

您必须 [ 登录 ] 才能发表留言!

×