在我的网页上,我有带有 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/