1

私のプログラムは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で保護されたフォームがすべて機能しなくなります。

では、どうすれば保護できますか?

4

3 に答える 3

1

Zend_Form_Element_Hash がハッシュを Zend_Session_Namespace に保存できるかどうかを確認する必要があります。これは、その要素のドキュメントによると予想される動作です: Zend Documentation

于 2009-10-26T17:28:10.280 に答える
1

ハッシュジェネレーターを呼び出すたびに、指定した SESSION 名前空間と場所が異なるはずです。そのため、実際のフォームを作成するときにのみハッシュを作成します。そうすることで、1 ホップ (ページの読み込みを意味する) のハッシュが保存され、ユーザーのフォームを再生成すると (特に) ハッシュが忘れられます。これが CSRF の目的です。期限切れのフォームを無効にすることで、フォームの乗っ取りを防止します。 (基本的)

ハッシュが毎回変化するためにフォームを「検証」できない場合は、タスクを間違った順序で実行しているため、プロセスを再評価する必要があります。

于 2009-11-07T06:58:21.713 に答える
-1

ここで私は私自身の解決策を提案します。しかし、それはまだあまりクールではないので、これに関する他のより良い解決策やコメントを喜んで聞きます.

パスワードハッシュとその他のパラメーターから各ユーザーのハッシュを生成します。ユーザーがパスワードを変更するまで、ハッシュはすべてのユーザーに対して一定です。

   public function getSecurityHash() {
          return md5( $this->getIntID() . $this->getLogin() . 'R00SuperSalt' );
   }

そして、次の形式で:

    $exithash = new Zend_Form_Element_Hidden('exithash');
    $exithash->setValue( R00_Auth::getUser()->getSecurityHash() )
             ->addValidator('Identical', false, array(
                R00_Auth::getUser()->getSecurityHash()
              ))
             ->setDecorators(array('ViewHelper'))
             ->setRequired(true);
于 2009-10-26T17:29:18.627 に答える