我遇到了Zend Framework 2 formElement csrf的问题。
它工作正常,直到我提交无效表单,点击同一页然后刷新页面。字段上出现“notTheSame”验证错误,并且消息“提交的表单不是来自预期的网站” 出现。这是正确的,因为如果我检查csrf字段的值,它与提交之前的值不同。
在我决定添加csrf字段之前,表单工作正常。
我正在创建我的csrf字段,如下所示:
class SignupForm extends Form
{
public function __construct()
{
parent::__construct('signup');
$this->setAttribute('method', 'post')
->setHydrator(new ClassMethodsHydrator(false))
->setInputFilter(new InputFilter());
$this->add(array(
'type' => 'Zend\Form\Element\Csrf',
'name' => 'csrf',
'options' => array(
)
));
// I also add a couple of fieldsets after this
在视图文件中:
<?php
$form = $this->form;
$form->setAttribute('action', $this->url('needfunding', array('action' => 'register')));
$form->setAttribute('class', "signup-form start");
$form->prepare();
echo $this->form()->openTag($form);
$applicant = $form->get('applicant');
?>
<?php $this->FormErrors($form); ?>
<?php echo $this->formRow($form->get('csrf')); ?>
(FormErrors是一个视图助手,可以检索表单消息并对其进行样式设置)
在我的控制器中:
public function signupAction()
{
$form = new SignupForm();
/* some unrelated code [...] */
$request = $this->getRequest();
if ($request->isPost()) {
$category_group_id = $request->getPost()->category_group;
$selected_categories = array();
foreach ($categories as $c) {
$selected_categories[$c->getId()]=html_entity_decode($c->getName());
}
$form->get('category')->setValueOptions($selected_categories);
$form->setData($request->getPost());
if ($form->isValid()) {
/* some unrelated code [...] */
return $this->redirect()->toRoute('signupconfirmation');
}
else {
}
}
return array('form' => $form, 'categories' => $ordered_categories);
}
我想我的问题是,为什么我的csrf会在我回到表单页面后重新生成,因为表单无效?
PS:我在这篇文章Zend Framework 2 CSRF Protection
中找不到我的解决方案答案 0 :(得分:0)
我遇到过类似的问题。
在我的情况下,我使用的是具有Zend\Authentication\Validator\Authentication
验证的登录表单。
验证程序在每次验证尝试时都会销毁会话,因为它使用Zend\Authentication\AuthenticationService
和默认的Zend\Authentication\Storage\Session
存储。
由于csrf值存储在会话中,因此使用验证程序会导致scrf值被破坏,因此必须在每次登录表单POST尝试时重新创建它。
所以,我的建议是:尝试检查会话是否在刷新期间不被破坏(它不应该)。此参考可能有所帮助:http://framework.zend.com/manual/2.2/en/modules/zend.session.config.html