2

私のWebページではZend_Form、CSRFハッシュを使用しています。同じページに送信され、ユーザーのデータ (名前、姓、生年月日など) を更新するために使用されます。有効な投稿を送信するたびに CSRF ハッシュを再初期化したいと思います。どうすればそれができますか?

「ユーザーデータ」フォームを初めて送信すると、適切な動作が得られます (ユーザーデータが更新されます)。しかし、別のフォームフィールドを変更するために(最初の適切な送信の直後に)再度送信すると、次のエラーが表示されます。

指定された 2 つのトークンが一致しません

ハッシュを適切に再初期化する方法はありますか?

4

2 に答える 2

1

問題はZend_Form_Element_Hash$session->setExpirationHopsis set to 1 hopのこの関数に起因するため、同じフォームを再送信しようとすると、常に失敗します。これは設計によるものであり、求めているセキュリティのルートです。

ただし、この動作は変更できます。単にZend_Form_Element_Hashこのメソッドを拡張してオーバーライドし、expirationHopsを好みの値に設定します (必要に応じて、いつでも手動でセッション オプションを設定することもできます)。

public function initCsrfToken()
    {
        $session = $this->getSession();
        $session->setExpirationHops(1, null, true);
        $session->setExpirationSeconds($this->getTimeout());
        $session->hash = $this->getHash();
    }

言うまでもなく、完全な更新を実行し、フォームを再入力して編集を実行することは、セキュリティ上重要です。これにより、ハッシュがリセットされます。

于 2012-08-30T08:52:31.167 に答える
1

私の問題は、Zend_Form_Element_Hash の初期化メソッドを改ざんしたことが原因でした。

$_csrf = new Zend_Form_Element_Hash($this->_csrfName);  
$_csrf->setSalt(md5($name));  
$_csrf->setAttrib('id', '');  
$_csrf->initCsrfToken();  

最後の行は決してそこにあるべきではありません。それを削除すると、すべてが正しく動作し始めました。
@RockyFord:initCsrfToken()関数は最初に見た場所でしたが
、私にとっては (私の直感を意味します)、それはあり得ませんでした。だから私はちょうどデバッグ、デバッグ、デバッグ、
そして最後に4行目をコメントアウトするのが適切な解決策でした。すっかり忘れてました、お返事遅れてすいません。

于 2013-01-09T22:18:03.903 に答える