php - 如何重新初始化 Zend_Form_Element_Hash?

标签 php zend-framework zend-form csrf

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

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

The two given tokens do not match

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

最佳答案

您的问题来自于 Zend_Form_Element_Hash 中的此函数,$session->setExpirationHops 设置为 1 hop,因此如果您尝试重新提交同样的形式它总是会失败。这是设计使然,也是您所寻求的安全性的根源。

但是您可以更改此行为,只需扩展 Zend_Form_Element_Hash 并重写此方法即可将 expirationHops 设置为您喜欢的值(您还可以设置 session 如果您愿意,可以随时手动选择)。

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

不言而喻,执行完全刷新并重新填充表单以执行任何编辑将符合安全性。这应该重置哈希值。

关于php - 如何重新初始化 Zend_Form_Element_Hash?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12187341/

相关文章:

php - PHP foreach 循环中的 JQuery $.post

php - 如何注释jquery中包含一行php代码的jquery代码块

php - 如何从 PHP 5.4 连接到 MS SQL 2000?

php - 如何在php中填写PDF表单

php - 如何将 INSERT…ON DUPLICATE KEY UPDATE 编写为单独的查询?

php - Zend db - 我什么时候应该引用以避免 sql 注入(inject)?

php - Zend_Form 交叉验证

zend-framework - 如何在 application.ini 中设置 zend 表单详细信息

php - Zend 框架 : Setting decorators and labels - should this be done in the view or the form class?

PHP : How to echo different case of Mysql result into table?