我有一个包含3个表单的页面,每个表单都有一个Zend_Form_Element_Hash用于CSRF保护。

问题在于它们中的两个在CSRF上运行良好,但另一个在哈希上存在问题。

我第一次提交它时,它返回“ missingToken”错误。 在那之后,如果我尝试再次提交,它就可以正常工作...。

我做了一个var_dump($ _ SESSION)看看发生了什么,输出是:

在视图中(创建表单时):

array(7) {
...
    ["__ZF"]=>
    array(3) {
        ["Zend_Form_Element_Hash_routeSearch_csrf"]=>
        array(2) {
            ...
        }
        ["Zend_Form_Element_Hash_registration_csrf"]=>
        array(2) {
            ...
        }
        ["Zend_Form_Element_Hash_login_csrf"]=>
        array(2) {
            ...
        }
    }
    ["Zend_Form_Element_Hash_routeSearch_csrf"]=>
    array(1) {
        ["hash"]=>
        string(32) "2e348e982e5d8849a7bcb3f42fdd6c0d"
    }
    ["Zend_Form_Element_Hash_registration_csrf"]=>
    array(1) {
        ["hash"]=>
        string(32) "6fd74223bb158cc3cc780ee29b26ae58"
    }
    ["Zend_Form_Element_Hash_login_csrf"]=>
    array(1) {
        ["hash"]=>
        string(32) "d07dc1ac514082f1960c300670414399"
    }
}

提交后:

array(6) {
...
    ["__ZF"]=>
    array(2) {
        ["Zend_Form_Element_Hash_login_csrf"]=>
        array(2) {
            ...
        }
        ["Zend_Form_Element_Hash_routeSearch_csrf"]=>
        array(2) {
            ...
        }
    }
    ["Zend_Form_Element_Hash_login_csrf"]=>
    array(1) {
        ["hash"]=>
        string(32) "d07dc1ac514082f1960c300670414399"
    }
    ["Zend_Form_Element_Hash_routeSearch_csrf"]=>
    array(1) {
        ["hash"]=>
        string(32) "b9378bec2fd18cf232f451ed602acf0a"
    }
}

如您所见,“ Zend_Form_Element_Hash_registration_csrf”已消失...

我尝试了我所知道的所有内容,但是没有发现什么可以使会话消失……有什么想法吗? Zend会导致什么?

顺便说一句,同一控制器在不同的动作中加载了两个表单(其中一个是有问题的表单)。 这可能是会议消失的原因吗?

请帮忙,因为我不知道该怎么做才能找到问题...我被困在这里= S。

------编辑------

好的,我找到了导致此问题的原因...问题是表单具有Ajax请求,并且当它们发生时,CSRF哈希值已过期(Hop = 1)。

有谁知道将表单用于CSRF + AJAX调用的解决方案?

===============>>#1 票数:0 已采纳

好的,我解决了此问题,然后在显示表单的Action和验证表单的Action中添加了CSRF元素,然后再保存到数据库中,而不是在Form类上创建CSRF元素

为了防止重复代码,我创建了此类:

class Application_Model_CSRF{

    public static function createCSRF($form, $csrf_salt_name, $field_name="csrf") {
        $element=$form->createElement('hash', $field_name,array(
            'salt' => $csrf_salt_name
        ));
        //Create unique ID if you need to use some Javascript on the CSRF Element
        $element->setAttrib('id',$form->getName().'_'.$element->getId());
        $form->addElement($element);
        return $element;
    }

}

然后,在显示表单的动作中以及在验证表单的其他动作中,使用以下代码:

$form    = new Application_Form_Account_Registration();
Application_Model_CSRF::createCSRF($form,"registration");

  ask by Cristiano Santos translate from so

未解决问题?本站智能推荐:

1回复

Zend_Form_Element_Hash随机故障

我在网站上加载了各种形式的ZF1盐腌哈希元素,并且有99%的时间它们工作正常,但偶尔会失败。 这通常似乎发生在重定向之后,但不在重定向跃点内。 表单是在重定向之后在单独的操作中创建的,因此我不明白为什么重定向会影响它。 失败的表单将正确生成其令牌,但在POST和验证后它们不匹配。 有
2回复

创建表单对象后,如何在特定位置添加zend表单元素?

我创建了一个扩展zend表单的user_form类,它具有4个元素的用户名,密码,csrf的哈希值和最后一个提交按钮。 创建user_form对象将呈现所有这四个元素。 在验证控制器操作中的登录后,我检查失败尝试,并且在经过一定数量的失败尝试后,我想在提交按钮之前添加zend cap
1回复

Zend表单元素标签“用于”属性

我将Zend_Form子类化,以允许重复使用,正如我在其他SO问题中所述 。 除我发现的一个问题外,它的运行情况非常好。 在我的视图脚本中,我使用以下代码来呈现字段的标签: 呈现的标签将原始元素id作为for属性中的值,而不是新的后缀元素id。 Zend代码中是否有错误,我错过了一
1回复

选择标记中的Zend表单空选项元素

在一个网站中,我想使用zend表单创建一个空的选项标签。 例如 我试图用多选项数组做到这一点 但是它给了我一个HTML如下
2回复

Zend表单元素错误不显示

我有一个简单的联系表单。提交表单时不显示错误消息。请帮我
2回复

Zend框架:Zend表单选择使用MultiOptions生成详细HTML

我有一种形式,我试图使用以下php添加一个简单的select元素: 它可以很好地呈现给页面,但是会生成以下XML: 为什么要在<option>标记中放入..label="..." ? 这实际上是应该针对XHTML标准执行的操作吗? 我的文档类型设置为XHTML S
3回复

在Zend表单验证中仅显示一个错误

我希望为表单设置一条错误消息,但仍要验证每个字段。 该表格是一个包含10个问题的调查。 它们每个都以相同的方式进行验证( ->setRequired(true) )。 因此,基本上,我只是要验证每个问题是否都有答案,如果没有回答其中一个,则会在表格顶部显示一条消息。 我尝试
1回复

从Zend Radio表单元素中删除选项

一个简单的问题。 我的表单中有一个带有多重选项的Zend_Form_Element_Radio元素。 我想删除控制器中的选项。 我发现了如何禁用选项...... 但我怎么能删除它? 删除一些装饰器? 或者,还有更好的方法? 提前致谢!
1回复

Zend Framework:带有标签的表单具有几种样式

我想创建一个带有包含两个不同样式的标签的表单,例如: “ 电子邮件 (输入您的电子邮件):” 我怎样才能做到这一点? 现在,我正在使用addElement()方法的label属性: 使用这种方法,我只能获得form标签的label属性,并且不能在其中使用其他样式。 谢
3回复

Zend表单数组表示法中的数字验证

我不知道在以下代码中为数字验证写什么: PS:我想保持数组符号