如何初始化Zend_Form_Element哈希?

时间:2012-08-29 22:23:01

标签: php zend-framework zend-form csrf

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

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

  

两个给定的令牌不匹配

有没有正确重新初始化哈希?

2 个答案:

答案 0 :(得分:1)

您的问题来自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();
    }

毫无疑问,执行完全刷新并重新填充表单以执行任何编辑都符合安全性。这应该重置哈希值。

答案 1 :(得分:1)

我的问题来自于篡改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行是正确的解决方案。抱歉回复,我完全忘了。