web-dev-qa-db-fra.com

Comment rendre l'entrée CSRF en brindille?

Je sais qu'il y a la manière habituelle de rendre l'entrée cachée du jeton CSRF avec form_rest, mais existe-t-il un moyen de rendre juste l'entrée CSRF elle-même? J'ai remplacé {% block field_widget %} dans le thème pour rendre un morceau de texte supplémentaire. Mais comme le jeton CSRF est également affiché dans le champ de saisie et j'ai obtenu un morceau de texte dont je n'ai pas besoin à côté d'un champ masqué. Je voudrais donc le rendre séparément avec un argument qui lui dit de ne pas rendre ce texte.

42
Ondrej Slinták

vous pouvez le faire avec {{ form_widget(formView._token) }}

93
Henrik Bjørnskov

Si vous avez un objet formView, vous pouvez le rendre en utilisant Twig function:

{{ form_widget(formView._token) }} 

Si ce n'est pas le cas, vous pouvez rendre le jeton sans utiliser directement un objet de formulaire:

<input type="hidden" name="token" value="{{ csrf_token('some-name') }}">

Fonctionne dans Symfony 2.x et 3.x

Pour valider le jeton, vous pouvez utiliser le code suivant dans votre contrôleur (Symfony 3.x):

$submittedToken = $request->request->get('token');

if ($this->isCsrfTokenValid('some-name', $submittedToken)) {
    // ... do something,
}
50
pliashkou

Ou vous pouvez simplement utiliser ceci:

{{ form_row(form._token) }}

Cela générera automatiquement les éléments HTML masqués appropriés, c'est-à-dire la structure HTML et les noms de champs appropriés, selon le type de formulaire que vous utilisez.

18
Anass

J'avais besoin de rendre l'entrée csrf à l'intérieur Twig afin que je puisse l'utiliser pour Supprimer opérations. L'utilisation de {{ csrf_token('authenticate') }} selon la réponse de @ YuryPliashkou me donne le jeton incorrect (celui qui n'est valable que pour les connexions!)

Ce qui a fonctionné pour moi était ceci {{ csrf_token('form') }} qui me donne le bon jeton csrf que je transmettrais ensuite à mon contrôleur via ajax.

<span id="csrf_token" data-token="{{ csrf_token('form') }}"></span> 
// my ajax call
$.ajax({
    url: localhost/admin/product/4545,   // 4545->id of the item to be deleted
    type: 'POST',
    data: {
        "_method": "DELETE",
        "form[_token]": $("#csrf_token").data("token")   // passed csrf token here
    },
    success: function(result) {
        // Do something 
   }
});

Vérifié son fonctionnement sur Symfony 3.x.

Référence

4
Niket Pathak

n'a pas trouvé de solution qui fonctionnait pour moi, a trouvé et testé et a travaillé pour ma valeur Simfony3 = "{{_token}}" dans l'exemple

     <form name="form" method="post" action="{{ path('blog_show', { 'id': blog.id }) }}">
       <input name="_method" value="DELETE" type="hidden">
       <input class="btn btn-danger" value="Delete" type="submit">
       <input id="form__token" name="form[_token]" value="{{ _token }}" type="hidden">
    </form>

plus d'informations sur scrf peuvent être consultées ici: Création manuelle de formulaires dans Symfony2, mais toujours utiliser son CSRF et isValid () fonctionnellement

1
Vladimir Ch