¿Cómo renderizar la entrada CSRF en twig?

3 minutos de lectura

avatar de usuario
Ondrej Slinták

Sé que existe la forma habitual de representar la entrada oculta del token CSRF con form_restpero hay una manera de hacer sólo Entrada CSRF en sí? he anulado {% block field_widget %} en el tema para representar una pieza de texto adicional. Pero como el token CSRF también se representa en el campo de entrada y obtuve un texto que no necesito junto a un campo oculto. Así que me gustaría representarlo por separado con un argumento que le diga que no represente este texto.

puedes hacerlo con {{ form_widget(formView._token) }}

avatar de usuario
pliashkou

Si usted tiene formView objeto, puede renderizarlo usando la función Twig:

{{ form_widget(formView._token) }} 

Si no lo ha hecho, puede representar el token sin usar el objeto de formulario directamente:

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

Funciona en Symfony 2.x y 3.x

Para validar el token puedes usar el siguiente código en tu controlador (Symfony 3.x):

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

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

  • Es bueno saberlo, a veces esta es una función muy útil

    – Luciano Mammino

    8 oct 2014 a las 23:19

  • Lo siento, no funcionó para mí 🙁 Obtuve “Los tokens CSRF solo se pueden generar si se inyecta una CsrfTokenManagerInterface en FormRenderer::__construct()”. en Symfony 3.1. ¿Pero qué FormRenderer? No quiero usar ningún formulario.

    – Xover

    16 de septiembre de 2016 a las 14:16

  • Esto funciona para mí en Symfony 3.2. aunque usted hizo una declaración de que se supone que ‘authenticate’ es el nombre del formulario. No creo que esto sea cierto. Siempre debe ser ‘autenticar‘ si lo está utilizando para iniciar sesión. Controlar documentos oficiales para esto.

    – Niket Pathak

    25 de marzo de 2017 a las 2:04


  • @NiketPathak Gracias, actualicé la respuesta con nueva información.

    – pliashkou

    14 de agosto de 2018 a las 8:30

O simplemente puede usar esto:

{{ form_row(form._token) }}

Esto generará automáticamente los elementos HTML ocultos adecuados, es decir, la estructura HTML y los nombres de campo adecuados, según el tipo de formulario que esté utilizando.

avatar de usuario
Niket Pathak

Necesitaba renderizar la entrada csrf dentro de Twig para poder usarla para Borrar operaciones. Usando {{ csrf_token('authenticate') }} según la respuesta de @YuryPliashkou, me da el token incorrecto (¡uno que solo es válido para iniciar sesión!)

Lo que funcionó para mí fue esto {{ csrf_token('form') }} lo que me da el token csrf correcto que luego pasaría a mi controlador a través de 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 
   }
});

Verificado su funcionamiento en Symfony 3.x.

Referencia

avatar de usuario
vladimir ch

no encontré la solución que funcionó para mí, encontré y probé y funcionó para mi Simfony3 value=”{{ _token }}” en el ejemplo

     <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>

Se puede ver más sobre scrf aquí: Crear formularios manualmente en Symfony2, pero seguir usando su CSRF e isValid() funcionalmente

¿Ha sido útil esta solución?