如果删除yii中的记录,则Csrftoken不会进行验证

时间:2013-12-03 11:13:27

标签: php yii

我正在学习Yii,我正在尝试csrf验证 我在 application.components.HttpRequest

中创建了以下类
class HttpRequest extends CHttpRequest {

    private $_csrfToken;

    public function getCsrfToken() {
        if($this->_csrfToken === NULL) {
            $this->_csrfToken=  sha1(uniqid(mt_rand(),true));

            if(!isset(Yii::app()->session['_tokenforcsrf'])) {
                Yii::app()->session['_tokenforcsrf']=  $this->_csrfToken;
            } else {
                Yii::app()->session['_tokenforcsrf']=  $this->_csrfToken;
            }

            return $this->_csrfToken;
        }
    }

    public function validateCsrfToken($event) {
        if($this->getIsPostRequest()) {
            if(isset(Yii::app()->session['_tokenforcsrf']) && isset($_POST['_tokenforcsrf'])) {
                $sessiontoken=Yii::app()->session['_tokenforcsrf'];
                $posttoken=$_POST['_tokenforcsrf'];

                if($sessiontoken === $posttoken) {
                    $validity=TRUE;
                } else {
                    $validity=FALSE;
                }

            } else {
                $validity=false;
            }

            if($validity==false) {
                throw new CHttpException(400,Yii::t('yii','The CSRF token could not be verified.'));
            }

        }
        parent::validateCsrfToken($event);
    }
}

csrf验证在一切情况下都能正常工作,但每当我尝试删除它显示的一些东西时 无法验证CSRF令牌 如果删除记录,则无法验证。

我尝试删除的链接是

 $this->menu = [
    [
        'label' => 'List Rolearea',
        'url' => ['index']
    ],
    [
        'label' => 'Create Rolearea', 
        'url' => ['create']
    ],
    [
        'label' => 'Update Rolearea', 
        'url' => [
            'update', 
            'owner'=>$model->roleName
        ]
    ],
    [
        'label' => 'Delete Rolearea', 
        'url' => '#', 
        'linkOptions' => [
            'submit' => [
                'delete',
                'id' => $model->roleNo
            ],
            'confirm' => 'Are you sure you want to delete this item?'
        ]
    ],
    [
        'label' => 'Manage Rolearea',
        'url' => ['admin']
    ],
];

所以我的问题是如何在这种情况下解决csrf验证问题?

1 个答案:

答案 0 :(得分:1)

您的代码要求必须通过POST调用通过CSRF令牌保护的所有操作。一个简单的链接将导致GET请求,这就是您的验证失败的原因。