2011-08-10 34 views
3

時,這裏是我的形式,即使檢測到:Symfony的CSRF攻擊路過_csrf_token

<form novalidate action="<?php echo url_for('article/submit') ?>" method="POST"> 
    <?php echo $form['title']->renderRow() ?> 
    <?php echo $form['content']->renderRow() ?> 
    <?php echo $form->renderHiddenFields() ?> 
    <input type="submit" value="Save"/> 
</form> 

而綜觀目前生成的HTML源,在_csrf_token其實是在渲染。這裏是我的行動:

public function executeSubmit(sfWebRequest $request) 
{ 
    $this->forward404Unless($request->isMethod('post')); 
    $request->checkCSRFProtection(); 

    die('submitting post...'); 
} 

錯誤:

_csrf_token [CSRF attack detected.] 

即使在我的動作,如果我做一個var_dump($_POST); die;我得到:

Array 
(
    [title] => string(8) "My title" 
    [content] => string(10) "My Content" 
    [_csrf_token] => string(32) "<my token here>" 
) 

所以CSRF令牌肯定是被渲染和正確傳遞。我究竟做錯了什麼?

另外,在任何地方是否有任何有關checkCSRFProtection()的文檔? API文檔除了承認它存在之外,不會對它做任何說明。

回答

4

有幾件事情要檢查:

來源:http://oldforum.symfony-project.org/index.php/t/17867/

確保您已在設置中定義的 「祕密」:

csrf_secret: ThisIsMySecret # Unique secret to enable CSRF protection or false to disable` 

而且,基於我從表單發帖中收集到的,CSRF保護檢查自動在$this->form->isValid()中完成,因此如果您已經檢查表單是否不需要您致電$request->checkCSRFProtection()已驗證。如果不是,請添加$this->form->isValid()

這似乎也$request->checkCSRFProtection()不適用於窗體;它的目的(如果我是正確的)是驗證用戶點擊鏈接時提供的請求。當啓用CSRF保護時,link_to()會自動爲其生成的鏈接添加CSRF保護。所以,基本上,對於表單的CSRF保護與不是源自表單的請求不同。

有關詳細信息,請參閱本票:http://trac.symfony-project.org/ticket/7315

另一票可能會感興趣:http://trac.symfony-project.org/ticket/5698

+1

的問題是,我試圖檢查使用'checkCSRFProtection()',而不是試圖用一種形式'isValid()'方法。謝謝你的幫助。 Symfony 1.4 API文檔不提供關於'checkCSRFProtection()'的任何細節。很高興知道它只適用於'link_to()'。再次感謝! –

+0

@Jakobud:很高興我能幫忙!是的,文檔看起來很蹩腳 –

+1

@jakobud:對於可能沒有實際表單來驗證的情況,您可以使用'checkCSRFProtection' ...例如簡單的ajax post請求刪除記錄。你可以看到生成的管理模塊中的一些例子和刪除操作,如果我記得正確。 – prodigitalson