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 должен быть создан с тем же именем, что и элемент