Php 表单提交后Zend Hash会话变量丢失
我有一个包含3个表单的页面,每个表单都有一个Zend_Form_元素_散列,用于CSRF保护 问题是其中两个可以很好地使用CSRF,但另一个在哈希方面有问题 我第一次提交它时,它返回“missingToken”错误。在那之后,如果我再提交一次,效果会很好 我进行了一次var_转储($_会话),以查看发生了什么,输出是: 在视图中(创建表单时):Php 表单提交后Zend Hash会话变量丢失,php,session,zend-form,zend-form-element,zend-framework,Php,Session,Zend Form,Zend Form Element,Zend Framework,我有一个包含3个表单的页面,每个表单都有一个Zend_Form_元素_散列,用于CSRF保护 问题是其中两个可以很好地使用CSRF,但另一个在哈希方面有问题 我第一次提交它时,它返回“missingToken”错误。在那之后,如果我再提交一次,效果会很好 我进行了一次var_转储($_会话),以查看发生了什么,输出是: 在视图中(创建表单时): array(7) { ... ["__ZF"]=> array(3) { ["Zend_Form_Element_
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"
}
}
提交后:
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\u Form\u Element\u Hash\u registration\u csrf”已经消失
我尝试了我所知道的一切,但没有找到什么可以使会议消失。。。有什么想法吗?究竟是什么原因造成的
顺便说一下,同一控制器在不同的操作中加载了其中两个表单(其中一个是有问题的表单)。这可能是会话消失的原因吗
请帮帮我,因为我不知道该怎么做才能找到问题。。。我被困在这里了
----编辑---
好吧,我找到了导致这一切的原因。。。问题是表单有Ajax请求,当它们发生时,CSRF哈希过期(Hop=1)
有人知道使用CSRF+AJAX调用表单的解决方案吗?好的,我解决了这个问题,在显示表单的操作和保存到数据库之前验证表单的操作中添加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");