2013-04-21 12 views
6

Erstens bin ich ein komplettes Anfänger mit Symfony 2. Die Frage klingt einfach, wenn ich versuche, einige Kontext in warum und wie ich brauche, wird es anfangen zu bekommen verwirrend.Symfony 2 Fügen Sie CSRF Token hinzu, wenn Sie ein Formular ohne Klasse verwenden

Im Wesentlichen habe ich ein Formular erstellt, das ich manuell mit Doctrine usw. verarbeiten, validieren und einfügen. Ich erstelle das Formular manuell innerhalb einer Controlleraktion (es wird dynamisch aus abgerufenen Werten von einem anderen Objekt erstellt). Ich gehe davon aus, dass es vielleicht bessere Möglichkeiten gibt, dies zu tun, aber da ich neu bei Symfony bin und Tage, an denen ich im Internet surfen kann, sehe ich keine Lösungen für das, was ich tun muss.

Deshalb baue ich nicht einfach ein Formular gegen eine Klasse/Entity etc und so werde ich manuell ein CSRF-Token oder irgendeine Art von Schutz hinzufügen müssen.

Unter normalen Umständen würden Sie den FormType erstellen und Standardoptionen mit csrf_protection konfigurieren. Dann ein einfacher Fall von:

{{ form_widget(form._token) }} 

und das csrf-Token ist da.

Da ich das Formular dynamisch bin, bin ich nicht sicher, wie ich manuell ein csrf-Token für mein Formular erstellen kann. Hat jemand Erfahrung mit dem Erstellen von Formularen ohne Klasse und Hinzufügen von CSRF-Schutz?

Mit freundlichen Grüßen Paul Pounder

Antwort

6

In (my) normalen Umständen Sie ein Formular erstellen und nicht speziell CSRF konfigurieren - es geschieht automatisch, und Sie verwenden form_rest(form) oder form_end(form) den versteckten Eingang mit CSRF-Token zu machen . Ich glaube nicht, dass dies für ein Formular, das nicht von einem Modell unterstützt wird, anders ist.

+2

Das ist richtig :) Egal, ob Sie das Formular bauen dynamisch oder nicht egal. Der CSRF-Schutz ist standardmäßig für alle Formulare aktiviert. –

+0

Danke Leute. Als richtig markiert. –

+1

Und kann ich ein CSRF-Token generieren, wenn ich den Symfony-Formularersteller nicht verwende?(Ursache Ich möchte meine Formulare manuell erstellen) – Gigala

25

Ich denke, was Sie suchen ist die folgende:

Dies wird eine CSRF-Token machen. Verwenden Sie diese Funktion, wenn Sie CSRF Schutz möchten, ohne eine Form zu schaffen

{{ csrf_token("intention") }} 

Zum Beispiel:

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

source

Um dieses Token von einem Controller zu validieren, können Sie tun:

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

Um zu vereinfachen überprüfen Sie die Token auf Symfony 2.6 oder neuer

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

Was ist das Argument des csrf_token? der Name des Formulars? – fain182

+0

@ fain182 Dies ist eine Art Filter für Ihr csrf-Token, so dass nur Controller/Seiten, die diese ID kennen, Ihr csrf-Token validieren. Mehr Infos gibt es: http://api.symfony.com/2.3/Symfony/Component/Form/Extension/Csrf/CsrfProvider/CsrfProviderInterface.html –

+0

Danke für die Hilfe mich @ Żabojad – LucaoA

10

Verbindung zwischen Formulartyp und Token:

{{ csrf_token("task_item_intention") }} 

und in Form Art:

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

Für Symfony2.7 + verwenden 'csrf_token_id' statt 'Absicht' in Standardoptionen. Weitere Informationen finden Sie im nachfolgenden Link. Sie können auch 'csrf_protection' und' csrf_field_name' überspringen, da sie standardmäßig auf die gleiche Weise konfiguriert sind, wie Sie oben sehen können. http://symfony.com/doc/current/form/csrf_protection.html – broiniac

Verwandte Themen