Zend form + защита csrf

Я пытаюсь защитить свою форму Zend с помощью токена crsf. В любом случае, если я добавляю элемент токена в свою форму, он всегда отправляет мне сообщение об ошибке notEmpty для токена. Я что-то не так делаю? Спасибо

class Application_Form_Test3 extends Zend_Form {

    public function init() {
        $this->setMethod('post');

//..some elements

        $note = new Zend_Form_Element_Textarea('note');
        $note->addValidator('stringLength', false, array(2, 50));
        $note->setRequired(true);
        $note->class = 'form-control';
        $note->setLabel('Poznámka:');
        $note->setAttrib('placeholder', 'poznamka ke spisu');
        $note->setOptions(array('cols' => '20', 'rows' => '4'));

        $submit = new Zend_Form_Element_Submit('submit');
        $submit->class = 'btn btn-success';
        $submit->setValue('odeslat');

        $this->addElements(array(
            $number,
            $year,
            $owner,
            $note,
            $submit,
        ));

        $this->addElement('hash', 'no_csrf_foo', array('salt' => 'unique'));
    }

}

Действие в контроллере:

public function findAction() {
    $request = $this->getRequest();
    $form = new Application_Form_Test3();

    if ($this->getRequest()->isPost()) {
        if ($form->isValid($request->getPost())) {
            var_dump($request->getPost());
        } else {
            var_dump("ERROR");
        }
    }

    $this->view->form = $form;
}

На мой взгляд, я отображаю сообщения об ошибках формы и дампа

...
<?php echo $form->renderForm(false); ?>
...
//render single elements here
//eg.  <?php echo $form->note->renderViewHelper(); ?>
...
    <?php var_dump($form->getMessages()) ?>
...

После каждой проверки формы я получаю массив таких сообщений об ошибках:

array(2) { ["note"]=> array(1) { ["isEmpty"]=> string(36) "Value is required and can't be empty" }  ["no_csrf_foo"]=> array(1) { ["isEmpty"]=> string(36) "Value is required and can't be empty" } } 

если я введу правильные значения в элементы, последняя ошибка всегда будет для токена - NotEmpty, поэтому моя форма никогда не будет действительной.


person porosman    schedule 24.02.2015    source источник
comment
Как элемент CSRF отображается в форме? Можете ли вы отредактировать вопрос и добавить HTML-вывод токена CSRF?   -  person Benz    schedule 24.02.2015
comment
Да, проблема заключалась в том, что я не визуализировал элемент токена. Я не использую декораторы в своей форме, поэтому я визуализирую каждый элемент в поле зрения вручную, поэтому я забыл визуализировать токен csrf. Так что спасибо за ваш комментарий, который дал мне решение.   -  person porosman    schedule 24.02.2015
comment
Хорошая находка :). Если вы ответите на свой собственный вопрос, вы можете установить это как «решено», должны позаботиться о любых других входящих пользователях, чтобы ответить на этот вопрос :)   -  person Benz    schedule 24.02.2015


Ответы (1)


Проблема решена. Я не отображал элемент токена в моем представлении, поэтому я добавил в представление:

<?php echo $form->no_csrf_foo->renderViewHelper(); ?>
person porosman    schedule 24.02.2015