2010-02-20 15 views
9

在Symfony中啓用CSRF保護功能以創建功能測試以測試表單的最佳方式是什麼?在Symfony中啓用CSRF的功能測試表格

目前,我有各種形式submittion之前添加以下代碼:

$form = new sfGuardFormSignin(); 
    $token = $form->getCSRFToken(); 
    $token_name = $form->getCSRFFieldName(); 

然後我添加$令牌和$ TOKEN_NAME形成這樣的參數:

call('/login', 'POST', array (
    'signin' => 
    array (
     'username' => $username, 
     'password' => $password, 
     $token_name => $token, 
    ))) 

選項中建議該文檔:

'_with_csrf' => true, 

根本不起作用。

是否有更簡單的方法來避免爲每個手動測試的表單添加標記?或者有沒有辦法在運行測試時關閉csrf檢查?

我上面描述的方式是可以的,當你必須測試1-2個表單時,如果項目包含幾十個獨特的表單,那麼這會變成一種痛苦。

+0

T他的文檔選項使用BaseForm的一個實例來擴展; CSRF令牌是使用表單類型生成的,所以MyFooForm!= BaseForm因此這就是爲什麼該選項失敗的原因......您的選擇是我在項目中完成的方式。 – richsage

+0

還有另一個原因,爲什麼它也失敗了。它將csrf標記添加到參數列表中,但通常以它在數組中的形式(如上面的示例)。所以它完全沒用:-(。 感謝您的評論。 – Stepashka

回答

4

當然,如果直接調用url,則不能使用_with_csrf選項。 您必須通過表單頁面,點擊提交按鈕。 像這樣:

click('signin', array('signin' => array('username' => $username, 'password' => $password), array('_with_csrf' => true))) 

字符串「登入」必須適應你的表格。您還可以使用更多與標籤無關的字符串,例如'form#myform input [type =「submit」]',而不是'signin',從而調整表單的ID。

如前所述,您可以將CSRF用於登錄,對於修改數據的表單非常有用。

3

我個人不會廣泛使用功能測試(可能是爲了我自己的損害),但您可以隨時在表單類中關閉CSRF保護以進行測試。

public function configure() 

    $this->disableLocalCSRFProtection(); 
0

我會關閉CSRF以測試環境。

0

您應該通過顯示包含表單的頁面來獲得CSRF令牌。

$browser->get('/login'); 
$dom = new DOMDocument('1.0', $browser->getResponse()->getCharset()); 
$dom->loadHTML($browser->getResponse()->getContent()); 
$domCssSelector = new sfDomCssSelector($dom); 
$token = $domCssSelector->matchSingle('input[name="_csrf_token"]')->getNode()->getAttribute('value'); 
1

您只需通過添加額外的編譯過程禁止所有形式的CSRF保護:

class CsrfProtectionCompilerPass implements CompilerPassInterface 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function process(ContainerBuilder $container) 
    { 
     $env = $container->getParameter('kernel.environment'); 
     if ($env == 'test') { 
      $container->setParameter('form.type_extension.csrf.enabled', false); 
     } 
    } 
} 

也可以通過增加配置完全禁用的形式延伸:

framework: 
    csrf_protection: false 

順便說一句,最後的解決方案只在您沒有明確設置表單選項時纔有效csrf_protection