Comment puis-je vérifier si l'fournis jeton CSRF est invalide dans Symfony2?
J'ai créé un formulaire Symfony2 et lié à la Demande. J'ai besoin de faire en sorte que le jeton CSRF est valide/invalide avant de procéder avec le reste de la forme.
$form['_token']->isValid()
jette OutOfBoundsException
avec le message "Enfant _token n'existe pas."
Je peux toujours vérifier que le rendu de formulaire contient _token
champ. Dans le cas où CSRF est invalide, $form->isValid()
renvoie la valeur false.
Ce qui me manque ici?
Mise à jour 1:
Contrôleur (partielle):
private function buildTestForm() {
$form = $this->createFormBuilder()
->add('name','text')
->getForm();
return $form;
}
/**
* @Route("/test/show_form", name="test.form.show")
* @Method("GET")
*/
public function showFormTest()
{
$form = $this->buildTestForm();
return $this->render('TestBundle::form_test.html.twig', array('form' => $form->createView()));
}
/**
* @Route("/test/submit_form", name="test.form.submit")
* @Method("POST")
*/
public function formTest()
{
$form = $this->buildTestForm();
$form->bind($this->getRequest());
if ($form['_token']->isValid()) {
return new Response('_token is valid');
} else {
return new Response('_token is invalid');
}
}
Modèle
{# Twig template #}
<form action="{{ path('test.form.submit') }}" method="post" {{ form_enctype(form) }}>
{{ form_widget(form) }}
<input type="submit" name="go" value="Test Form" />
</form>
il vous manque au moins sous la forme de code.
vrai - maintenant, ajout de code pour reproduire le problème.
Jeton CSRF la validation se fait automatiquement symfony.com/doc/current/book/forms.html#csrf-protection
oui, je suis conscient de cela. Le problème est que j'ai besoin de réagir différemment dans le cas où _token est pas valide. C'est pourquoi j'ai besoin de vérifier explicitement.
vrai - maintenant, ajout de code pour reproduire le problème.
Jeton CSRF la validation se fait automatiquement symfony.com/doc/current/book/forms.html#csrf-protection
oui, je suis conscient de cela. Le problème est que j'ai besoin de réagir différemment dans le cas où _token est pas valide. C'est pourquoi j'ai besoin de vérifier explicitement.
OriginalL'auteur Ville Mattila | 2013-02-23
Vous devez vous connecter pour publier un commentaire.
Il n'est pas documentée de manière à vérifier jeton csrf manuellement. Symfony valide automatiquement la présence et l'exactitude de ce jeton. http://symfony.com/doc/current/book/forms.html#csrf-protection
Cependant il y a une csrf fournisseur de:
http://api.symfony.com/2.0/Symfony/Component/Form/Extension/Csrf/CsrfProvider/SessionCsrfProvider.html
et
http://api.symfony.com/master/Symfony/Component/Form/Extension/Csrf/CsrfProvider/DefaultCsrfProvider.html
Vous pouvez récupérer le fournisseur comme ce
utiliser pouvez ensuite utiliser
Vous avez besoin de finde l'intention de chaîne utilisé par votre formulaire.
Certains postes intéressants sur DONC:
Symfony CSRF et Ajax
Symfony2 liens avec jeton CSRF
security.csrf.token_manager
à la place. api.symfony.com/2.7/Symfony/Component/Security/Csrf/...OriginalL'auteur Artjom Zabelin
En plus de artworkad, vous pouvez spécifier une intention:
Twig:
PHP:
Ou pas:
Twig:
PHP:
ajax est le même ?!
Vous pouvez régénérer le jeton en ajax et mise à jour de votre valeur d'entrée :
public function tokenAction($intention) { $csrf = $this->get('security.csrf.token_manager'); $token = $csrf->refreshToken($intention); return new Response($token); }
OriginalL'auteur p-bizouard
Je ne suis pas sûr de cela, mais avez-vous essayé le programme de validation sur un champ non mappé:
OriginalL'auteur Mick