Zend Framework 2 CSRF保护

时间:2013-04-30 17:04:56

标签: php zend-framework zend-framework2 csrf

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

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

  

提交的表单并非源自预期的网站

我已经以这种方式实施了CSRF保护:

1)创建了一个Form Class并添加了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 个答案:

答案 0 :(得分:2)

我的控制器中有这一行:

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

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

感谢您的支持!

答案 1 :(得分: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();

答案 2 :(得分:0)

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

相同的名称构造csrf / validator