2

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

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

两个给定的令牌不匹配

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

4

2 回答 2

1

您的问题来自设置为1 hopZend_Form_Element_Hash的此功能,因此如果您尝试重新提交相同的表单,它将始终失败。这是设计使然,是您寻求的安全性的根源。$session->setExpirationHops

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

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

不言而喻,为了安全起见,执行完全刷新并重新填充表单以执行任何编辑。这应该重置哈希。

于 2012-08-30T08:52:31.167 回答
1

我的问题来自篡改 Zend_Form_Element_Hash 初始化方法,我有这个:

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

最后一行不应该在那里。当我删除它时,一切都开始正常运行。
@RockyFord:这个initCsrfToken()功能是我一开始就看的地方,但
对我来说(我的意思是我的直觉)它不可能是那样的。所以我只是调试,调试,调试,
最后注释掉第 4 行是正确的解决方案。抱歉推迟回复,我完全忘记了。

于 2013-01-09T22:18:03.903 回答