Zend Framework 2 CSRF Защита

В настоящее время я пытаюсь использовать CSRF-защиту Zend Framework 2.

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

Форма отправлена ​​не с ожидаемого сайта

Я реализовал защиту CSRF следующим образом:

1) создал класс формы и добавил csrf:

$this->add(array(
    'type' => 'Zend\Form\Element\Csrf',
    'name' => 'secret',
    'options' => array(
        'csrf_options' => array(
            'timeout' => 600
        )
    )
));

2) повторил элемент csrf в файле представления:

 echo $this->form()->openTag($forgotPasswordForm);
 echo $this->formRow($forgotPasswordForm->get('email'));
 echo $this->formRow($forgotPasswordForm->get('secret'));
 echo $this->formSubmit($forgotPasswordForm->get('submit'));
 echo $this->form()->closeTag($forgotPasswordForm);

Я понял, что токен csrf не сохраняется в сеансе, но почему?

3 ответа

У меня была эта строка в моем контроллере:

$forgotPasswordForm = new ForgotPassword();
$forgotPasswordForm->prepare();

я переехал $forgotPasswordForm->prepare() к файлу просмотра и теперь он работает:-)

Спасибо за поддержку!

Вы можете создать экземпляр формы в контроллере или добавить DI, но $ view->prepare() должно быть выполнено в представлении. Почти использовать скрытое в представлении для де CSRF.

Я использую этот шпаргалку, это лучшее, что я нашел для ZF2, в ней почти есть что-то для доктрины 2. http://zf2cheatsheet.com/

Вот код, который я использую.

<?php
// module/Album/src/Album/Form/AlbumForm.php:
namespace Album\Form;

use Zend\Form\Form;
use Zend\Form\Element;

class AlbumForm extends Form
{

    public function __construct($name = null)
    {

        parent::__construct('album');
        $this->add(array(
            'name' => 'id',
            'type' => 'Hidden',
        ));
        /* not including other elements for short answer*/
        **$this->add(new Element\Csrf('security'));**

        $this->add(array(
            'name' => 'submit',
        'type' => 'Submit',
        'attributes' => array(
            'value' => 'Go',
            'id' => 'submitbutton',
            ),
        ));
    }

}

<?php
// module/Album/view/album/album/add.phtml:
$form->setAttribute('action', $this->url('album', array(
        'action' => 'add' )));
**$form->prepare();**

echo $this->form()->openTag($form);
echo $this->formHidden($form->get('id'));
echo $this->formRow($form->get('title'));
echo $this->formRow($form->get('artist'));
**echo $this->formHidden($form->get('security'));**
echo $this->formSubmit($form->get('submit'));
echo $this->form()->closeTag();

Я просто использую csrf/element в форме и использую csrf/validator в моих входных валидаторах. csrf/validator должен быть создан с тем же именем, что и элемент

Другие вопросы по тегам