2012-08-29 60 views
2

在我的網頁上我有Zend_Form與CSRF哈希值。它提交到相同的頁面,它用於更新用戶的數據(名稱,姓氏,出生日期等等)。我希望在每次有效的提交後重新初始化CSRF哈希值。我怎麼能做到這一點?如何重新初始化Zend_Form_Element_Hash?

現在,當我第一次提交'用戶數據'表格時,我得到了正確的行爲(用戶數據得到更新)。但是,如果我再次提交(第一次之後,適當提交)更改另一個表單字段,我得到錯誤說:

兩個給定的令牌不匹配

反正是有正確初始化哈希?

回答

1

我的問題就來了,我有這樣的:

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

最後一行不應該在那裏。當我刪除它時,一切都開始正確。
@RockyFord:initCsrfToken()功能是我在看的開始,但對我來說
(我的意思是我的直覺),它不可能是這樣。所以我只是調試,調試,調試,
和最後評論第四行是適當的解決方案。抱歉沒有回覆,我完全忘了。

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(); 
    } 

毫無疑問,執行完全刷新和重新填充表單以執行任何編輯將會有利於安全。這應該重置散列。從Zend_Form_Element_Hash初始化方法篡改