【发布时间】:2015-02-24 18:32:58
【问题描述】:
我正在尝试使用 crsf 令牌保护我的 Zend 表单。如果我将令牌元素添加到我的表单中,它总是会向我发回令牌的 notEmpty 错误消息。我做错了什么?谢谢
class Application_Form_Test3 extends Zend_Form {
public function init() {
$this->setMethod('post');
//..some elements
$note = new Zend_Form_Element_Textarea('note');
$note->addValidator('stringLength', false, array(2, 50));
$note->setRequired(true);
$note->class = 'form-control';
$note->setLabel('Poznámka:');
$note->setAttrib('placeholder', 'poznamka ke spisu');
$note->setOptions(array('cols' => '20', 'rows' => '4'));
$submit = new Zend_Form_Element_Submit('submit');
$submit->class = 'btn btn-success';
$submit->setValue('odeslat');
$this->addElements(array(
$number,
$year,
$owner,
$note,
$submit,
));
$this->addElement('hash', 'no_csrf_foo', array('salt' => 'unique'));
}
}
控制器中的操作:
public function findAction() {
$request = $this->getRequest();
$form = new Application_Form_Test3();
if ($this->getRequest()->isPost()) {
if ($form->isValid($request->getPost())) {
var_dump($request->getPost());
} else {
var_dump("ERROR");
}
}
$this->view->form = $form;
}
在我看来,我呈现表单并转储错误消息
...
<?php echo $form->renderForm(false); ?>
...
//render single elements here
//eg. <?php echo $form->note->renderViewHelper(); ?>
...
<?php var_dump($form->getMessages()) ?>
...
每次验证表单后,我都会收到类似这样的错误消息数组:
array(2) { ["note"]=> array(1) { ["isEmpty"]=> string(36) "Value is required and can't be empty" } ["no_csrf_foo"]=> array(1) { ["isEmpty"]=> string(36) "Value is required and can't be empty" } }
如果我为元素填充了好的值,最后一个错误总是针对令牌 - NotEmpty,所以我的表单永远不会有效。
【问题讨论】:
-
CSRF元素在表单中是如何显示的?您可以编辑问题并添加 CSRF 令牌的 HTML 输出吗?
-
是的,问题是我没有渲染令牌元素。我不在我的表单中使用装饰器,所以我手动渲染视图中的每个元素,所以我忘了渲染 csrf 令牌。所以谢谢你的评论,这给了我解决方案。
-
不错的发现:)。如果您回答您自己的问题,您可以设置为“已解决”应该照顾任何其他传入用户来回答这个问题:)
标签: forms zend-framework csrf