ThinkPHPトークン検証例


ThinkPHPはフォームトークン認証機能を内蔵しており、フォームの遠隔提出などのセキュリティ保護を効果的に防ぐことができます。
フォームトークンの検証に関する構成パラメータは、以下の通りである。

'TOKEN_ON'=>true, //          
'TOKEN_NAME'=>'__hash__', //               
'TOKEN_TYPE'=>'md5', //            MD5 
フォームトークン認証機能をオンにすると、システムは自動的にフォーム付きテンプレートファイルに自動的に生成され、TOKEN__NAMEは名称の隠し領域で、その値はTOKEN_です。TYPE方式で生成されたハッシュ文字列は、フォームの自動トークン検証を実施するために使用される。
自動的に生成された隠し領域はフォームフォームフォームフォームフォームのForm終了フラグの前にあります。隠し領域の位置を自分で制御したいなら、手動でフォームページに__uを追加することができます。TOKEN識別情報は、システムがテンプレートを出力するときに自動的に置き換えられます。フォームトークン認証がオンされている場合、個別フォームはトークン認証機能を使用する必要がないので、フォームページにuu_uuを追加することができる。NOTOKEN_,システムは、現在のフォームのトークン認証を無視する。
ページに複数のフォームがある場合は、_u uを追加することを推奨します。TOKEN識別し、1つのフォームだけがトークン検証を必要とすることを保証する。
モデル類は、データオブジェクトを作成しながら、自動的にフォームトークン検証動作を行いますが、create方法を用いてデータオブジェクトを作成していない場合は、手動でモデルのaut CheckToken方法を呼び出してフォームトークン検証を行う必要があります。falseに戻ると、フォームトークン認証エラーを表します。たとえば:

$User = M("User"); //    User   
//          
if (!$User->autoCheckToken($_POST)){ 
//        
} 
ThinkPHPフレームのView.class.phpに共通のテンプレート置換関数が定義されています。

protected function templateContentReplace($content) {
 //            
 $replace = array(
 '../Public' => APP_PUBLIC_PATH,//       
 '__PUBLIC__' => WEB_PUBLIC_PATH,//       
 '__TMPL__' => APP_TMPL_PATH, //       
 '__ROOT__' => __ROOT__, //       
 '__APP__' => __APP__, //       
 '__UPLOAD__' => __ROOT__.'/Uploads',
 '__ACTION__' => __ACTION__, //       
 '__SELF__' => __SELF__, //       
 '__URL__' => __URL__,
 '__INFO__' => __INFO__,
 );
 if(defined('GROUP_NAME'))
 {
 $replace['__GROUP__'] = __GROUP__;//       
 }
 if(C('TOKEN_ON')) {
 if(strpos($content,'{__TOKEN__}')) {
 //            
 $replace['{__TOKEN__}'] = $this->buildFormToken();
 }elseif(strpos($content,'{__NOTOKEN__}')){
 //           
 $replace['{__NOTOKEN__}'] = '';
 }elseif(preg_match('/<\/form(\s*)>/is',$content,$match)) {
 //            
 $replace[$match[0]] = $this->buildFormToken().$match[0];
 }
 }
 //                
 if(is_array(C('TMPL_PARSE_STRING')) )
 $replace = array_merge($replace,C('TMPL_PARSE_STRING'));
 $content = str_replace(array_keys($replace),array_values($replace),$content);
 return $content;
 }
上のif(C('TOKEN_)ON')はトークン検証のオープン状態を判断し、オンにするとbuildFormToken()メソッドを呼び出します。SESSION[$tokenName]=$tokenValue;実は$SESSION[*]hash_賦課金トークン検証をしたくないなら、ページのの前に参加すればいいです。NOTOKENう関数によって空に置換されます。
ThinkPHPのModel.class.phpクラスでトークンの検証関数を定義しました。

//       
 if(C('TOKEN_ON') && !$this->autoCheckToken($data)) {
 $this->error = L('_TOKEN_ERROR_');
 return false;
 }

 //         
 public function autoCheckToken($data) {
 $name = C('TOKEN_NAME');
 if(isset($_SESSION[$name])) {
 //         
 if(empty($data[$name]) || $_SESSION[$name] != $data[$name]) {
 //     
 return false;
 }
 //       session
 unset($_SESSION[$name]);
 }
 return true;
 }