3

目前我尝试使用 Zend Framework 2 的 CSRF 保护。

但是每次我发送表单时,都会收到以下错误消息:

提交的表单不是来自预期的站点

我以这种方式实现了 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 令牌没有存储在会话中,但是为什么呢?

4

3 回答 3

2

我的控制器中有这一行:

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

我移到$forgotPasswordForm->prepare()了视图文件,现在它可以工作了:-)

谢谢您的支持!

于 2013-05-02T07:58:36.110 回答
1

您可以在控制器中实例化表单,或使用 DI 注入,但 $form->prepare() 必须在视图中完成。几乎使用隐藏在视图中的 de csrf。

我使用这个备忘单,它是我为 ZF2 找到的最好的,它几乎有教义 2 的东西。 http://zf2cheatsheet.com/#controller

这是我使用的代码。

<?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();
于 2014-03-09T11:01:08.447 回答
0

我只是在表单中使用 csrf/element 并在我的输入验证器中使用 csrf/validator。csrf/validator 必须与元素同名构造

于 2013-11-04T14:08:00.093 回答