当前位置: 首页 > 知识库问答 >
问题:

Zend表单csrf保护

闾丘永春
2023-03-14

我正试图用crsf令牌保护我的Zend表单。如果我在表单中添加token元素,它总是会向我返回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" } } 

如果我给元素填充了正确的值,最后一个错误总是token-NotEmpty,因此我的表单永远无效。

共有1个答案

幸越泽
2023-03-14

问题解决了。我没有在视图中呈现令牌元素,因此我在视图中添加了:

<?php echo $form->no_csrf_foo->renderViewHelper(); ?>
 类似资料:
  • 目前我尝试使用Zend Framework 2的CSRF保护。 但每次我发送表单时,都会收到以下错误消息: 提交的表格不是来自预期的网站 我以这种方式实施了CSRF保护: 1)创建了一个Form Class并添加了csrf: 2)在view文件中呼应csrf元素: 我发现csrf令牌没有存储在会话中,但是为什么呢?

  • 我需要在全球ZF1项目上添加CSRF保护。我知道如何添加单个表单,但我已经在项目中创建了很多表单。所以,为每一种形式做这件事是非常乏味和耗时的工作。我需要一个插件或ZF1的任何库,它在每个表单元素的顶部添加一个层,并在每个表单上使用CSRF令牌接收post请求。我们高度赞赏实现这一点的任何逻辑。

  • 我有Zend框架2的应用基础。我有一个带有CSRF字段的表单。如果我填写表单并在大约5分钟后提交,它会给我验证错误。 所以我认为会话配置可能有问题。然后我在如下所示 但问题依然存在。你知道如何解决这个问题吗? --更新-- 我的表单类包含CSRF元素,如下所示, 这些似乎都不起作用。

  • CSRF是指针对Web应用程序的跨站点伪造攻击。 CSRF攻击是系统的经过身份验证的用户执行的未授权活动。 因此,许多Web应用程序容易受到这些攻击。 Laravel以下列方式提供CSRF保护 - Laravel包含一个内置的CSRF插件,可为每个活动用户会话生成令牌。 这些令牌验证相关的经过身份验证的用户是否发送了操作或请求。 实现 (Implementation) 本节将详细讨论Laravel

  • 简介 Laravel 可以轻松地保护应用程序免受 跨站点请求伪造 (CSRF) 攻击,跨站点请求伪造是一种恶意攻击,它凭借已通过身份验证的用户身份来运行未经过授权的命令。 Laravel 会自动为每个活跃用户的会话生成一个 CSRF「令牌」。该令牌用于验证经过身份验证的用户是否是向应用程序发出请求的用户。 无论何时,当您在应用程序中定义HTML表单时,都应该在表单中包含一个隐藏的CSRF标记字段,

  • 6.9 CSRF和XSRF保护 6.9.1 简介 Cross-Site Request Forgery (CSRF) 跨站请求伪造是一种攻击,发生在具有恶意的网站,email,blog,即时消息,或者程序导致用户的web浏览器在一个受信用的网站去执行了某个有害的行为来获取当前用户的认证信息,详细了解请点击这里脑补。 在ASP.NET Web API官网也有如何实现的简短描述。 ABP框架尽可能的简