2013-04-21 46 views
6

首先,我是一個Symfony 2的完全noobie。這個問題聽起來很簡單,如果我嘗試將某些上下文放入爲什麼以及如何需要它,它將開始獲取混亂。Symfony 2當使用沒有類的表單時添加CSRF標記

實質上,我創建了一個表單,我手動處理,使用Doctrine等進行驗證和插入。我在控制器動作(它是從另一個對象的檢索值動態構建的)中手動創建表單。我假設可能有更好的方法來做到這一點,但由於我是Symfony的新手和網絡拖網的日子,我看不到任何我需要做的解決方案。

因此,我不是簡單地針對類/實體等構建表單,因此我將手動添加CSRF標記或某種保護。

在正常情況下,您將創建FormType並將默認選項配置爲具有csrf_protection。然後一個簡單的例子:

{{ form_widget(form._token) }} 

和csrf標記在那裏。

由於我動態構建表單,我不確定如何手動爲我的表單創建csrf標記。有沒有人有過創建沒有課堂表格並添加csrf保護的經驗?

親切的問候 保羅·龐德爾

回答

6

在(我的)正常情況下,你創建一個表單和專門配置CSRF - 它會自動進行,您使用form_rest(form)form_end(form)來渲染CSRF令牌的隱藏輸入。我不認爲這是一個沒有模型支持的表單。

+2

這是正確的:)無論你建立形式動態或不是無關緊要。所有表單上默認啓用CSRF保護。 – 2013-04-23 22:39:12

+0

謝謝大家。標明這是正確的。 – 2013-04-24 18:48:57

+1

當我不使用Symfony表單構建器時,我可以生成一個CSRF-Token嗎?(因爲我喜歡手動創建我的表單) – Gigala 2013-04-25 08:23:11

25

我想你要找的是以下內容:

這將呈現一個CSRF令牌。如果你想CSRF保護使用此功能,而無需創建一個表單

{{ csrf_token("intention") }} 

例如:

<a href="{{ path('remove_stuff', {token: csrf_token('intention')}) }}">Remove</a> 

source

要從控制器驗證這個道理,你可以這樣做:

if ($this->get('token') !== $this->get('security.csrf.token_manager')->getToken('intention')->getValue()) { 
    throw new \Symfony\Component\Security\Core\Exception\InvalidCsrfTokenException('Invalid CSRF token'); 
} 

爲了簡化檢查令牌上的Symfony 2.6或更新表單類型和令牌之間

if ($this->isCsrfTokenValid('intention', $submittedToken)) { 
    // ... do something, like deleting an object 
} 
+0

csrf_token的參數是什麼?表單的名稱? – fain182 2013-12-27 11:48:49

+0

@ fain182這是一種針對您的csrf標記的過濾器,因此只有知道此標識的控制器/頁面纔會驗證您的csrf標記。更多的信息在這裏:http://api.symfony.com/2.3/Symfony/Component/Form/Extension/Csrf/CsrfProvider/CsrfProviderInterface.html – 2014-01-11 10:38:07

+0

感謝您的幫助我@Żabojad – LucaoA 2017-06-08 16:09:38

10

連接:

{{ csrf_token("task_item_intention") }} 

,並在表單類型:

class TaskType extends AbstractType 
{ 
// ... 

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class'  => 'Acme\TaskBundle\Entity\Task', 
     'csrf_protection' => true, 
     'csrf_field_name' => '_token', 
     // a unique key to help generate the secret token 
     'intention'  => 'task_item_intention', 
    )); 
} 

// ... 
} 
+0

對於Symfony2.7 +使用'csrf_token_id'而不是默認選項中的'意圖'。查看下面的鏈接瞭解更多信息。您也可以跳過'csrf_protection'和'csrf_field_name',因爲它們在默認情況下是以與上面相同的方式配置的。 http://symfony.com/doc/current/form/csrf_protection.html – broiniac 2017-12-20 19:28:04