如何重新初始化Zend_Form_Element_Hash


how to reinitialize Zend_Form_Element_Hash?

在我的网页上,我有带有CSRF哈希的Zend_Form。它提交到同一个页面,用于更新用户的数据(姓名、姓氏、出生日期等)。我想在每次有效的后期提交后重新初始化CSRF哈希。我该怎么做?

现在,当我第一次提交"用户数据"表单时,我得到了正确的行为(用户数据得到了更新)。但如果我再次提交(就在第一次之后,正确提交)以更改另一个表单字段,我会收到错误信息:

两个给定的令牌与不匹配

是否存在正确重新初始化哈希的方法?

您的问题来自Zend_Form_Element_Hash中的此函数,$session->setExpirationHops设置为1跃点,因此如果您尝试重新提交相同的表单,它总是会失败。这是经过设计的,是您所寻求的安全性的根源。

但是,您可以更改此行为,只需扩展Zend_Form_Element_Hash并覆盖此方法即可将expirationHops设置为您喜欢的值(如果您喜欢,也可以随时手动设置会话选项)。

public function initCsrfToken()
    {
        $session = $this->getSession();
        $session->setExpirationHops(1, null, true);
        $session->setExpirationSeconds($this->getTimeout());
        $session->hash = $this->getHash();
    }

不用说,执行完全刷新并重新填充表单以执行任何编辑都符合安全性。这应该会重置哈希。

我的问题来自于对Zend_Form_Element_Hash init方法的篡改,我有这样的问题:

$_csrf = new Zend_Form_Element_Hash($this->_csrfName);  
$_csrf->setSalt(md5($name));  
$_csrf->setAttrib('id', '');  
$_csrf->initCsrfToken();  

最后一行永远不应该出现。当我取下它时,一切都开始正常运转
@RockyFord:initCsrfToken()功能是我一开始关注的地方,但
对我来说(我指的是我的直觉)不可能是那样的。所以我只是调试,调试,调试
最后指出第4行是正确的解决方案。抱歉耽误了回复,我完全忘记了。