yii2 关于csrf

文章来自http://blog.crarun.com/article-7.html

在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,
        ),
    ),
 
时间: 2024-09-28 20:56:16

yii2 关于csrf的相关文章

yii2 ajax post设置csrf

由于yii2的csrf机制,如果是自己写ajax post提交方式,会提示提交数据验证错误,有两种解决方法: 1.关于controller里面的csrf验证 public $enableCsrfValidation = false; 2.根据Yii::$app获取csrftoken; $csrfparam = json_encode(array(Yii::$app->request->csrfParam=>Yii::$app->request->getCsrfToken())

yii2表单提交CSRF验证

Yii2表单提交默认需要验证CSRF,如果CSRF验证不通过,则表单提交失败,解决方法如下: 第一种解决办法是关闭Csrf public $enableCsrfValidation = false; 第二种解决办法是在form表单中加入隐藏域(如果是高级版的name值分前后台区分) <input type="text" name="_csrf-frontend" value="<?= Yii::$app->request->csrf

Yii2 Unable to verify your data submission

出现这种错误第一时间是怀疑CSRF没有填写的原因,不建议网上所说的关闭csrf,这存在安全隐患,于是直接在表单填写<input type="hidden" name="_csrf" id='csrf' value="<?= Yii::$app->request->csrfToken ?>"> 重新提交以下,还是同样的问题,于是追踪源码,发现name的名称有误,我使用的是yii2的高级后台模板,准确的name名称

YII2框架详解

yii2框架的安装我们在之前文章中已经提到下面我们开始了解YII2框架 Yii2的应用结构: 目录篇: advance版本的特点是:根目录下预先分配了三个模块,分别是前台.后台.控制台模块. 1.backend 它主要用于管理后台,网站管理员来管理整个系统. assets 目录用于存放前端资源包PHP类. 这里不需要了解什么是前端资源包,只要大致知道是用于管理CSS.js等前端资源就可以了. config 用于存放本应用的配置文件,包含主配置文件 main.php 和全局参数配置文件 param

YII2项目常用技能知识总结

1.不通过日志获取AR执行的原生SQL语句和打印变量数据 $query = User::find() ->select(['username'])->where(['id'=>[1,2,3,4]) // get the AR raw sql in YII2 $commandQuery = clone $query; echo $commandQuery->createCommand()->getRawSql();$users = $query->all(); 打印变量数

Yii2提交表单提示无法验证

yii2使用gii生成的搜索视图里的表单使用的是get方式,我改为post就提示无法验证,以为是控制器默认访问是get,实际默认是get和post都可以 public function behaviors() { return [ 'verbs' => [ 'class' => VerbFilter::className(), 'actions' => [ 'delete' => ['post'], ], ], ]; } 之所以提示无法验证是因为对于post请求,是有一个CSRF验

Yii2请求,报400错误

出现400错误是yii2.0的csrf防范策略导致 在components里面添加request配置如下: 'request' => [ // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation 'cookieValidationKey' => '83r5HbITBiMfmiYPOZFdL-raVp4O1VV4', 'enableCookieValid

yii2 表单提交一直报错 或者页面脚本写ajax,用firbug调试总是找不到地址页面404

在Yii框架中,为了防止csrf攻击,封装了CSRF令牌验证,使用Yii表单生成页面的时候,如果表单的提交方式为POST,是都会在页面中添加一个隐藏字段: <div style="display:none">     <input type="hidden" value="a429b6c0f4468db23a5661d1682db537fe2672c7" name="YII_CSRF_TOKEN" />

yii2 表单提交 出现Unable to verify your data submission 错误

yii2 开发 手写 form 表单, 没有使用 yii 自带的部件, 提交的时候出现错误: Unable to verify your data submission 原因: 由于 yii2 内部防止 CSRF 攻击,内部有 检测机制. 解决方案: 方案1.在对应的控制器中添加 :    public $enableCsrfValidation=false; 不建议这么做:安全性着想: 方案2.在表单中 添加 此隐藏 列: <input type="hidden" name=&