2012-09-11 70 views
0

我想從動作a重定向到動作b在同一個模塊中。動作b需要執行csrf令牌,我還需要傳遞一些參數。php symfony 1.4:如何使用csrf令牌重定向

動作:

public function executeA(sfWebRequest $request){ 

    //... do stuff 

    $this->redirect('module/b?id='.$something->getId()); 

} 

動作b:

public function executeB(sfWebRequest $request){ 

    $request->checkCSRFProtection(); //morte 

    $something_id = $request->getParameter('id'); 
    //... do stuff 

} 

動作b執行,僅當點擊由link_to('module/b?id='.$something.getId() , array('method' => 'post'))或任何其他方法來創建錨,因爲它發送CSRF令牌與所述請求。

我想$this->forward()$this->redirect()方法,並嘗試添加'method' => 'post'重定向像link_to() PARAMS,但沒有什麼工作,我不能找到任何關於它的網絡上的任何東西。 API文檔說明了這一點。我得到的全部是

500 | Internal Server Error | sfValidatorErrorSchema 
_csrf_token [Required.] 

錯誤。它在標記爲//morte的行上失敗。請,有誰知道,如何正確地做到這一點,以及在我想重定向到其他模塊的情況下?

+0

'_csrf_token'只在形式使用。你是否在轉發表格? – j0k

+0

'_csrf_token'也用於某些方法的錨點。例如''url_for('module/action',array('method'=>'post')'檢查這個錨點的'html',在操作中使用'$ request-> checkCSRFProtection()'我不想簡單地通過輸入url來訪問,以回答你的問題:不,我沒有轉發表單,我只想在完成處理表單時觸發csrf保護動作 – Kuro

+0

這對我而言仍然不清楚。 。 – j0k

回答

2

好了,現在更清楚了。

事實上,_csrf_token不是重定向到其他動作,我的意思是,你沒有重新添加它在查詢中。

嘗試:

public function executeA(sfWebRequest $request){ 

    //... do stuff 

    $this->redirect('module/b?id='.$something->getId().'?_csrf_token='.$request->getParameter('_csrf_token')); 

} 
+0

是否有可能在控制器,例如'executeB'類? – Kuro

+0

嗯,是的。你應該創建一個假的sfForm,然後調用['getCSRFToken()'](http://trac.symfony-project.org/browser/branches/1.4/lib/form/sfForm.class.php#L884)。但是爲什麼不生成一個自定義參數,比如'execute1'中的?nocsrf = 1,然後在'executeB'中檢查'nosrf'是否在這裏,不要調用'checkCSRFProtection'? – j0k

+0

難道不會達到目的嗎?任何知道該參數工作的人都可以繞過CSRF保護檢查。我用假表單試了一下,但它不起作用。 ''檢測到CSRF攻擊。''我不知道'$ this-> checkCSRFProtection()'方法在symfony中是如何工作的,但是根據錯誤報告,它在某些sfForm上執行了一個'bind()'函數,儘管我沒有在控制器部分創建任何形式來檢查它。 – Kuro