Yii的CSRF验证
2016-03-30 11:30
489 查看
在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>自己写的表单需要手动添加隐藏字段
<input type="hidden" value="<?php echo Yii::app()->getRequest()->getCsrfToken(); ?>" name="YII_CSRF_TOKEN" />用户在提交表单的同时,将该字段提交给服务器端,Yii框架会将该有客户端提交过来的隐藏字段和客户端提交过来的Cookie中的YII_CSRF_TOKEN值进行比较。相同则通过继续执行,不相同则会抛出400异常:"The CSRF token could not be verified."。
上面的方法是将客户端提交过来的值和客户端的Cookie中的值进行比较,并不是最为安全的方法。
目前更为安全的方式,是将客户端提交过来的值和Session中的值进行比较,这就需要重写CHttpRequest类了。具体步骤如下:
重写CHttpRequest:创建一个类HttpRequest继承于CHttpRequest,并将该类存放在 protected/components 下。重写CHttpRequest的 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.')); }}修改配置文件main.php:
'components' => array( 'request' => array( 'class' => 'application.components.HttpRequest', 'enableCsrfValidation' => true, ), ),
相关文章推荐
- yii2中使用Active Record模式的方法
- 从零开始学YII2框架(四)扩展插件yii2-kartikgii
- 从零开始学YII2框架(三)扩展插件yii2-gird
- 从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
- Yii2使用小技巧之通过 Composer 添加 FontAwesome 字体资源
- Yii2隐藏frontend/web和backend/web的方法
- 从零开始学YII2框架(二)通过 Composer 安装扩展插件
- 在Yii2中使用Pjax导致Yii2内联脚本载入失败的原因分析
- yii2框架中使用下拉菜单的自动搜索yii-widget-select2实例分析
- Yii2框架引用bootstrap中日期插件yii2-date-picker的方法
- yii2中添加验证码的实现方法
- Yii2 操作不同的数据库
- Yii2 自定义过滤器
- 使用 yii2-detail-view 扩展修改/删除/查看模型数据
- 【Yii2.0.7】 ./yii migrate 执行数据库迁移时出现2002错误的解决方法!
- YII2 输出 执行的 SQL 语句,直接用程序输出
- Yii2 安装 Redactor 富文本编辑器
- 使用yii2 composer更新后报错 ::addRules()
- Yii2 模板嵌套用法