1

Zend_Form から Zend の CSRF トークンを使用する際に問題が発生しています...

フォームを送信するたびに、検証エラーが発生します (CSRF が使用するのと同じ)

私のプロジェクトの初期には、これで問題はありませんでしたが、当時はコントローラーから渡されたecho $this->form;ビューで単純に使用していました。formこの「echo ..$form」に戻せば問題を解決できますが、現在、各要素とそのレンダリング方法を細かく制御する必要があるため、各要素を個別に 1 つずつエコーする必要があります。また、最大限のセキュリティ対策、特に CSRF などの基本が必要です。

これは、フォーム要素を使用して「ログイン」ページをレンダリングする方法です。問題は明らかにここから始まりますが、フォームがある場所ならどこでも同じです(どこにでもあります:))

.

<form id="login" enctype="application/x-www-form-urlencoded" method="<?php echo $form->getMethod() ?>" action="<?php echo $form->getAction() ?>">
<div class="login-section">
    <div class="form-container inputsLogin">
    <?php echo $form->agency->renderLabel() . $form->agency->renderViewHelper() ?>
    <br /><br />
    <?php  

    echo $form->username->renderLabel() . 
        $this->formText('username', '', array(
          'required' => True,
        )); 

    echo $form->password->renderLabel() . 
        $this->formPassword('password', '', array(
        'required' => True,
        ));

    echo $form->returnUrl->renderLabel() . $form->returnUrl->renderViewHelper();
    echo $form->csrf_token->renderLabel() . $form->csrf_token;

    ?>

    <div class="element">
          <?php echo $this->formSubmit('submit', 'Login') ?>
    </div>
      </div>
     </div>
   </form>

CSRF 要素を追加するために Zend_Form を拡張しましたが、プロジェクトの早い段階で各フォーム クラスにそれがありました。$form の他の要素と同じように CSRF 要素を取得し、ビューにエコーします。CSRF が 2 回生成されていると思われますが、最初のものを期待していますが、わかりません。私はいくつかのことを試しました...ラベルをエコーする、ラベルをエコーし​​ない、ビューでcsrf要素を完全に生成する、タイムアウトを設定する(またはしない)。

また、わかりやすくするために、フォームクラスでCSRF要素を宣言する方法を次に示します...

class Application_Form_Actform extends Zend_Form {

    function __construct() 
    { 
        parent::__construct();

        $this->addElement('hash', 'csrf_token', array(
                    'required' => 'true',
                    'salt' => get_class($this) . 'unique',
                    'ignore' => true,
                    'timeout' => 60000,
                    'errorMessages' => array(
                        'Identical' => 'Form may have timed out, or there is an attempt at forgery (Security issue). Please submit form again.'
                        ), 

                    )); 
    }

}

更新: 2 つのトークンを取得していると思います。次の出力がありvar_dump($_SESSION);ます。

array(2) { '__ZF' => array(1) { 'Zend_Form_Element_Hash_Application_Form_Loginunique_csrf_token' => array(2) { 'ENNH' => int(1) 'ENT' => int(1347378030) } } 

'Zend_Form_Element_Hash_Application_Form_Loginunique_csrf_token' => array(1) { 'hash' => string(32) "e3df9bf3a76cf53a804b337b8b513191" } }

そして、これはビュー ソースのトークンです。

<input type="hidden" name="csrf_token" value="a8727d61c656c64861181c7141d766a5" id="csrf_token" />
4

0 に答える 0