目前我尝试使用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令牌没有存储在会话中,但为什么?
答案 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