在我的網頁上我有Zend_Form
與CSRF哈希值。它提交到相同的頁面,它用於更新用戶的數據(名稱,姓氏,出生日期等等)。我希望在每次有效的提交後重新初始化CSRF哈希值。我怎麼能做到這一點?如何重新初始化Zend_Form_Element_Hash?
現在,當我第一次提交'用戶數據'表格時,我得到了正確的行爲(用戶數據得到更新)。但是,如果我再次提交(第一次之後,適當提交)更改另一個表單字段,我得到錯誤說:
兩個給定的令牌不匹配
反正是有正確初始化哈希?
在我的網頁上我有Zend_Form
與CSRF哈希值。它提交到相同的頁面,它用於更新用戶的數據(名稱,姓氏,出生日期等等)。我希望在每次有效的提交後重新初始化CSRF哈希值。我怎麼能做到這一點?如何重新初始化Zend_Form_Element_Hash?
現在,當我第一次提交'用戶數據'表格時,我得到了正確的行爲(用戶數據得到更新)。但是,如果我再次提交(第一次之後,適當提交)更改另一個表單字段,我得到錯誤說:
兩個給定的令牌不匹配
反正是有正確初始化哈希?
我的問題就來了,我有這樣的:
$_csrf = new Zend_Form_Element_Hash($this->_csrfName);
$_csrf->setSalt(md5($name));
$_csrf->setAttrib('id', '');
$_csrf->initCsrfToken();
最後一行不應該在那裏。當我刪除它時,一切都開始正確。
@RockyFord:initCsrfToken()
功能是我在看的開始,但對我來說
(我的意思是我的直覺),它不可能是這樣。所以我只是調試,調試,調試,
和最後評論第四行是適當的解決方案。抱歉沒有回覆,我完全忘了。
您的問題來源於此功能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();
}
毫無疑問,執行完全刷新和重新填充表單以執行任何編輯將會有利於安全。這應該重置散列。從Zend_Form_Element_Hash初始化方法篡改