2011-08-18 54 views
0

我有一個關於CSRF安全性和登錄表單的問題。該表單的工作原理如下:如何CSRF保護張貼到另一個頁面的表單?

在主佈局中,視圖助手創建登錄表單,稍後還會在用戶通過身份驗證時顯示用戶特定的菜單。

// User menu viewhelper 
public function authentication() 
{ 
    // Check if user is authenticated or not 
    $auth = Zend_Auth::getInstance(); 

    if(!$auth->hasIdentity()) 
    { 
     $form = new Application_Form_Login(); 
     $form->setAction($this->_view->url(array('action' => 'login'), 'ucp', true)); 

     return $form; 
    } 
    else 
    { 
     // return user specific menu 
    } 
} 

形式職位,以包含所有用戶的控制面板的邏輯,諸如進/出記錄和顯示用戶的特定信息的UcpController。

// loginAction in UcpController 
public function loginAction() 
{ 
    if(Zend_Auth::getInstance()->hasIdentity()) 
    { 
     $this->_redirect('/'); 
     return; 
    } 

    $request = $this->getRequest(); 

    $form = new Application_Form_Login(); 

    if($request->isPost()) 
    { 
     if($form->isValid($post = $request->getPost())) 
     { 
      // Do authentication stuff here. 
     } 
    } 

    $this->view->form = $form; 
} 

可悲的是,這種CSRF令牌無法匹配,我無能爲力的如何解決這個問題。我在這裏錯過了什麼嗎?我應該一起去除CSRF驗證嗎?提前

// The CSRF protection element as added to the login form 
$this->addElement('hash', 'csrf', 
    array(
     'ignore' => true 
    ) 
); 

謝謝你的幫助是極大的讚賞:)

回答

0

問題解決了!我遇到了遇到同樣問題的人。原因很奇怪:http://tinyurl.com/3fkg8bk(ZF論壇)。

隨着它轉向我,我的圖標正在返回HTTP 500代碼,因爲該文件不存在。這顯然觸發了一個新的CSRF產生。我沒有絲毫的線索,但它解決了我創建圖標並將其上傳到webroot的問題。

謝謝至少和我一起思考!

+0

偉大的現在我遇到了一個問題,當我張貼小表單和憑據不正確,大表單加載導致2相同的形式加載在頁面上。當我提交大型表單時,令牌無法再次驗證。 –

0

您的代碼似乎是正確的,我想這個問題可能是別的地方。要調試這個問題,這樣做:當你發佈數據

使用Firebug檢查生成Application_Form_Login,尤其是CSRF令牌,然後嘗試Zend_Debug::dump$_SESSION$_POST陣列在你的LoginAction和比較的結果。您應該在發佈的數據和會話數據之間找到匹配。

您應搜索發送的帖子變量和名爲Zend_Form_Element_Hash_salt_<name-of-your-element>的會話變量之間的匹配項,如果值匹配,則錯誤在其他地方,您應該轉儲$form->getMessages()以找到它。

正如zerkms在評論中指出的,我之前的這句話是錯誤的。我查看了implementation,並且我看到ZF中的CSRF令牌在300秒內發生了一次更改,此超時過期令牌不應成爲您的問題。

+2

每個請求的新CSRF令牌非常痛苦。每個會話的令牌數量足夠,並且按照每個http請求實現的安全性。 – zerkms

+0

@zerkms我錯了,在ZF中令牌在300秒內改變一次(默認情況下)我剛剛更新了答案。謝謝。 – Fabio

+0

這很好奇,會話數據顯示一個空數組。 –