Yii2的CSRF令牌验证以及重写加强安全性
- 9196
- PHP
- 3
- super_dodo
- 2015/11/06
在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="_csrf" /> </div> #自己写的表单需要手动添加隐藏字段 <input type="hidden" value="<?php echo Yii::$app->getRequest()->getCsrfToken(); ?>" name="_csrf" />
用户在提交表单的同时,将该字段提交给服务器端,Yii框架会将该有客户端提交过来的隐藏字段和客户端提交过来的Cookie中的_csrf值进行比较。
相同则通过继续执行,不相同则会抛出400异常:"The CSRF token could not be verified."。
上面的方法是将客户端提交过来的值和客户端的Cookie中的值进行比较,并不是最为安全的方法。
目前更为安全的方式,是将客户端提交过来的值和Session中的值进行比较,这就需要重写CHttpRequest类了。具体步骤如下:
1.重写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.'));
}
}
}
2.修改配置文件main.php:
'components' => array( 'request' => array( 'class' => 'application.components.HttpRequest', 'enableCsrfValidation' => true, ), ),
好的爱情那需要什么努力啊。我觉得爱情最好的状态就是我不需要天天给你送早餐百般讨好你,你也不用这么辛苦把整个世界送到我面前来,但是我们依然过得很开心。
相关阅读
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例
热门文章
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例
最新文章
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例

