dポイントプレゼントキャンペーン実施中!

zend_formを使っておりCSRF対策として使えるようだったので
Zend_Form_Element_Hashを試しているのですが以下のようなエラーになります。

「The two given tokens do not match」

ちなみにソースはこんな感じです。

$this->setMethod('post');

$this->addElement('text', 'username', array(
'label' => 'ユーザ名:',
'required' => true,
'validators' => array(
'Alnum',
'NotEmpty',
)
));

$this->addElement('password', 'password', array(
'label' => 'パスワード:',
'required' => true,
'validators' => array(
'Alnum',
'NotEmpty',
array('StringLength', false, array(8)),
)
));

$this->addElement('submit', 'login', array(
'ignore' => true,
'label' => 'Submit',
));

$this->addElement('hash', 'csrf', array(
'ignore' => true,
));

ソースを確認したところhiddenに値は埋め込まれてありました。

エラーからすると一致しないとの事なので$request->getPost()を
参照してみましたが確かに全く違う値でした。

というか、ポストされエラーがなければ生成した乱数をセッションに
登録し確認画面でhiddenの値とセッションの値が一致すればOKという
のが普通ですよね?

しかし、セッションをvar_dumpしても乱数が登録されてる様子もなく
何と比較しているのか根本的なところが謎です。。。

echo $this->_form->getValue('csrf');

上記のようにしても乱数の取得ができずマニュアルを見ても解決策が
全くわからないのですがどのようにすればうまく動作するのでしょうか?

A 回答 (1件)

こちらでテストしてみましたが、特に問題なく動作しているようでした。


一度、シンプルな動作をさせてみてから、画面の遷移など考えてみてはいかがでしょう。

<?php

public function testAction(){

$form = new Zend_Form();
$form->addElement('hash', 'csrf');
$form->addElement('submit, 'test');

if($this->_request->isPost()){

$posts = $this->_request->getPost();

if($form->isValid($posts)){

echo "OK";

}else{

echo "NG";

}


}

}


?>
一応これで問題なく画面が遷移していました。

尚、Zend Frameworkが内部で使っているセッション用のクラスのZend_Session_Namespaceクラスは、スーパーグローバル変数である$_SESSIONには記録されないようですので、Zend_Form_Element_Hash内で使われている値を見たいなら、
<?php

$session = $form->test->getSession(); //testと書いてあるところはInputタグのName値

echo $session->hash;

?>
とかとすれば、取得したトークンが取得できると思います。

この回答への補足

おへんじありがとうございます。
シンプルに試してみましたがやはり一致しないとのエラーになってしまいます^^;
謎です・・・

補足日時:2011/03/08 19:06
    • good
    • 0
この回答へのお礼

独自ルーティングの設定が関係してました。
うまく説明ができませんが、認証プラグインでログイン画面に飛ばす設定を変更したところ
エラーなく通りました!
原因は不明ですがひとまず解決しましたのでありがとうございます。

お礼日時:2011/03/08 21:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!