Yii的csrf验证

5 篇文章 0 订阅
在Yii框架中,为了防止csrf攻击,封装了CSRF令牌验证。
只需要在主配置文件中进行简单的配置,就可以实现CSRF的验证。
    'components'=>array(
        'request'=>array(
            // Enable Yii Validate CSRF Token
            'enableCsrfValidation' => true,
        ),
    ),
将enableCsrfValidation设置为true了之后,Yii在生成页面的时候,如果表单的提交方式为POST,是都会在页面中添加一个隐藏字段
<div style="display:none"><input type="hidden" value="a429b6c0f4468db23a5661d1682db537fe2672c7" name="YII_CSRF_TOKEN" /></div>
为GET时,需要自己手工地在页面添加上述的隐藏字段。
<input type="hidden" value="<?php echo Yii::app()->getRequest()->getCsrfToken(); ?>" name="YII_CSRF_TOKEN" />
用户在提交表单的同时,将该字段提交给服务器端,Yii框架会将该有客户端提交过来的隐藏字段和客户端提交过来的Cookie中的YII_CSRF_TOKEN值进行比较。
相同则通过继续执行,不相同则会提示错误" The CSRF token could not be verified."。

上面的方法是将客户端提交过来的值和客户端的Cookie中的值进行比较。
并不是最为安全的方法。目前更为安全的方式,是将客户端提交过来的值和Session中的值进行比较,
这就需要重写CHttpSession类了。具体步骤如下:
1.重写CHttpSession。
创建一个类HttpSession重写CHttpSession,并将该类存放在 protected/components 下。
复写 getCsrfToken() 和 validateCsrfToken($event) 方法。
private $_csrfToken;
// 
public function getCsrfToken()
{
    if($this->_csrfToken===null)
    {
        $session = Yii::app()->session;
        $csrfToken=$session->itemAt($this->csrfTokenName);
        if($csrfToken===null)
        {
            $csrfToken = sha1(uniqid(mt_rand(),true));
            $session->add($this->csrfTokenName, $csrfToken);
        }
        $this->_csrfToken = $csrfToken;
    }
 
    return $this->_csrfToken;
}
// 
public function validateCsrfToken($event)
{
    if($this->getIsPostRequest())
    {
        // only validate POST requests
        $session=Yii::app()->session;
        if($session->contains($this->csrfTokenName) && isset($_POST[$this->csrfTokenName]))
        {
            $tokenFromSession=$session->itemAt($this->csrfTokenName);
            $tokenFromPost=$_POST[$this->csrfTokenName];
            $valid=$tokenFromSession===$tokenFromPost;
        }
        else
            $valid=false;
        if(!$valid)
            throw new CHttpException(400,Yii::t('yii','The CSRF token could not be verified.'));
    }
}
2.修改配置文件main.php
	'components' => array(
	    'request' => array(
	        'class' => 'application.components.HttpRequest',
	        'enableCsrfValidation' => true,
	    ),
	),







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值