yii的csrf使用

csrf的思想: php

------------------------------------------------------------- html

yii使用: json

1. 在表單中加一個隱藏域 cookie

<div id="tokenId" type="hidden"><?php $this->useCsrfToken();?></div>



public function useCsrfToken(){
		$request=Yii::app()->request;
		echo CHtml::hiddenField($request->csrfTokenName,$request->getCsrfToken(),array('id'=>false));
	}



2. 在後臺提供訂單後驗證

public function validateCsrfToken()
	{
		$request=Yii::app()->request;
		if($request->getIsPostRequest())
		{
			// only validate POST requests
			$cookies=$request->getCookies();
			if($cookies->contains($request->csrfTokenName) && isset($_POST[$request->csrfTokenName]))
			{
				$tokenFromCookie=$cookies->itemAt($request->csrfTokenName)->value;
				$tokenFromPost=$_POST[$request->csrfTokenName];
				$valid=$tokenFromCookie===$tokenFromPost;
			}
			else
				$valid=false; 
			if(!$valid){
				if (Yii::app()->request->isAjaxRequest) {
					echo Controller::TOKENERROR;
					Yii::app()->end();
				} else {
				    @header('HTTP/1.1 403 Forbidden');
				    $_SERVER['HTTP_REFERER'] = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : 'NO_HTTP_REFERER';
				    YiiLog('令牌錯誤, 非法請求! -'.json_encode($_POST).'|'.$_SERVER['REQUEST_URI'].'|'.$_SERVER['HTTP_REFERER']);
				    Yii::app()->end();
				}
			}
		}
	}
其實就是,判斷cookie裏的值和表單隱藏字段的那個值是否是相同。
相關文章
相關標籤/搜索