My_Form_Token

My_Form_Tokenはフォームの画面遷移をチェックするトークンID管理のコンポーネントです。適正に使用する事でブラウザの「戻る」ボタンによる予期しない遷移やリロードによる情報の二重送信、サイトの画面を正しく経由していない情報送信を検出・防止できます。

基本的な使用方法

My_Form_Tokenで使用するメソッドは次の3つです。

  • My_Form_Token::generateToken(): ランダムなトークン文字列を生成します。セッション中に生成した文字列をセットし、同時に返り値としてその文字列を返します。
  • My_Form_Token::checkToken($str): セッション中に保存されているトークン文字列と$strが一致するかを判定します。
  • My_Form_Token::destroyToken(): セッション中のトークン文字列を破棄します。

 

My_Form_Tokenで画面遷移の判定を行うには、controller中に次のように記述します。controllerではメンバ変数として$_form_tokenが宣言されるため、改めてMy_Form_Tokenを宣言する必要はありません。

public function testAction(){

    // POSTの場合
    if($this->getRequest()->isPost()){
       $post_data = $this->getRequest()->getPost();

        if(!$this->_form_token->checkToken($post_data['token_id'])){
            throw new Zend_Exception('FORM_TOKEN_ERROR');
        }
        else{
            $token_id = $this->_form_token->generateToken();
            $this->view->token_id = $token_id;
        }

        // 処理完了の場合はトークンを破棄する
        if($complete === 'true'){
            $this->_form_token->destroyToken();
	}
        else{
            $token_id = $this->_form_token->generateToken();
            $this->view->token_id = $token_id;
        }
    }
}

また、該当のビューファイルのform中でtoken_idを渡すようにして下さい。

<input type="hidden" name="token_id" id="token_id" value="<{$token_id|escape}>" />

このようにする事で、画面遷移の順番が決まっている場合に不正な遷移を防止する事ができます。サンプルファイルでは管理画面の新規追加、編集アクションで使用されており、入力画面や確認画面間で不正な画面遷移ができないようになっています。

関連ページ