私のプログラムはZendFrameworkを使用しており、Zend_Form_Element_Hashを使用してユーザーをCSRFから保護したいと考えていました。しかし、それはうまくいかないようです。
たとえば、ログアウトフォームのコードは次のとおりです。
$exithash = new Zend_Form_Element_Hash('hihacker', array('salt' => 'exitsalt'));
$this->addElement($exithash);
コントローラ用の認証プラグインでは、
$exitForm = new R00_Form_Exit();
if ($exitForm->isValid($_POST)) {
R00_Auth::logout(); // a wrapper for Zend_Auth::getInstance()->clearIdentity();
Zend_Registry::get('Log')->info('User has logged out');
$this->setRedirect($request); // redirect to the current page
}
そして私のレイアウトでは
echo new R00_Form_Exit();
わかった。しかし、それは機能しません。フォームの送信ボタンをクリックすると、ページがリロードされますが、IDはまだ存在します。
私が気付いたように、Zend_Form_Element_Hashは、フォームがユーザーからのハッシュを作成し、セッションからのハッシュ(最後に生成されたハッシュ)と比較するたびに、新しいハッシュ値を生成します。とても不思議です。たとえば、アプリケーションでR00_Form_Exitを1つだけ作成し、レジストリに保存してそこからエコーしようとしても、サイトのページを「新しいタブで」開くと、そのようなcsrfで保護されたフォームがすべて機能しなくなります。
では、どうすれば保護できますか?