【问题标题】:Zend form + csrf protectionZend 表单 + csrf 保护
【发布时间】: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


【解决方案1】:

问题解决了。我没有在我的视图中呈现令牌元素,所以我添加到视图中:

<?php echo $form->no_csrf_foo->renderViewHelper(); ?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-03
    • 2019-05-16
    • 1970-01-01
    • 2015-04-30
    • 2012-09-28
    • 2011-02-16
    • 2017-11-22
    • 1970-01-01
    相关资源
    最近更新 更多