Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 表单提交后Zend Hash会话变量丢失_Php_Session_Zend Form_Zend Form Element_Zend Framework - Fatal编程技术网

Php 表单提交后Zend Hash会话变量丢失

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_

我有一个包含3个表单的页面,每个表单都有一个Zend_Form_元素_散列,用于CSRF保护

问题是其中两个可以很好地使用CSRF,但另一个在哈希方面有问题

我第一次提交它时,它返回“missingToken”错误。在那之后,如果我再提交一次,效果会很好

我进行了一次var_转储($_会话),以查看发生了什么,输出是:

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

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");