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)); }
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裏的值和表單隱藏字段的那個值是否是相同。