我正在学习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验证问题?
答案 0 :(得分:1)
您的代码要求必须通过POST
调用通过CSRF令牌保护的所有操作。一个简单的链接将导致GET
请求,这就是您的验证失败的原因。