【问题标题】:how to reinitialize Zend_Form_Element_Hash?如何重新初始化 Zend_Form_Element_Hash?
【发布时间】:2012-08-24 14:50:47
【问题描述】:

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

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

给定的两个标记不匹配

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

【问题讨论】:

    标签: php zend-framework zend-form csrf


    【解决方案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();
        }
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2016-06-26
        • 1970-01-01
        • 2018-12-15
        • 2021-11-06
        • 2013-03-27
        • 1970-01-01
        • 1970-01-01
        • 2019-09-18
        • 2016-07-15
        相关资源
        最近更新 更多