php - traductor - the csrf token is invalid. please try to resubmit the form. traducir
El token CSRF no es válido. Intente volver a enviar el formulario (13)
Además de las sugerencias de los demás, puede obtener errores de token CSRF si el almacenamiento de la sesión no funciona.
En un caso reciente, un colega mío cambió ''session_prefix'' a un valor que tenía un espacio en él.
session_prefix: ''My Website''
Esto rompió el almacenamiento de la sesión, lo que a su vez significó que mi formulario no pudo obtener el token CSRF de la sesión.
Recibo este mensaje de error cada vez que intento enviar el formulario:
El token CSRF no es válido. Intente volver a enviar el formulario
Mi código de formulario es este:
<form novalidate action="{{path(''signup_index'')}}" method="post" {{form_enctype(form)}} role="form" class="form-horizontal">
<div class="form-group">
{{ form_label(form.email, ''Email'', {''label_attr'': {''class'': ''col-md-1 control-label''}}) }}
{{ form_widget(form.email, {''attr'': {''class'': ''col-md-2''}}) }}
{{ form_errors(form.email) }}
</div>
<div class="form-group">
{{ form_label(form.nickname, ''Nickname'', {''label_attr'': {''class'': ''col-md-1 control-label''}}) }}
{{ form_widget(form.nickname, {''attr'':{''class'': ''col-md-2''}}) }}
{{ form_errors(form.nickname, {''attr'': {''class'': ''col-md-3''}}) }}
</div>
<div class="form-group">
{{ form_label(form.password, ''password'', {''label_attr'': {''class'': ''col-md-1 control-label''}}) }}
{{ form_widget(form.password, {''attr'': {''class'': ''col-md-2''}}) }}
{{ form_errors(form.password, {''attr'': {''class'': ''col-md-3''}}) }}
</div>
<div class="form-group">
{{ form_label(form.password_repeat, ''Repeat password'', {''label_attr'': {''class'': ''col-md-1 control-label''}}) }}
{{ form_widget(form.password_repeat, {''attr'':{''class'': ''col-md-2''}}) }}
{{ form_errors(form.password_repeat, {''attr'': {''class'': ''col-md-3''}}) }}
</div>
<div class="form-group">
<div class="col-md-1 control-label">
<input type="submit" value="submit">
</div>
</div>
</form>
¿Algunas ideas?
Antes de colocar su etiqueta </form>
:
{{ form_rest(form) }}
Insertará automáticamente otras entradas importantes (ocultas).
En caso de que no quiera usar form_row o form_rest y solo quiera acceder al valor de _token en su plantilla twig. Use lo siguiente:
<input type="hidden" name="form[_token]" value="{{ form._token.vars.value }}" />
En mi caso, tuve un problema con la anotación maxSize en la entidad, por lo que la aumenté de 2048 a 20048.
/**
* @Assert/File(
* maxSize = "20048k",
* mimeTypes = {"application/pdf", "application/x-pdf"},
* mimeTypesMessage = "Please upload a valid PDF"
* )
*/
private $file;
Espero que esta respuesta ayude!
Enfrenté un problema similar. Después de asegurarse de que el campo de token se haya renderizado en realidad (ver respuesta aceptada) revisé mis cookies. Había 2 (!) Cookies para el dominio en mi navegador Chrome, aparentemente porque estaba ejecutando la aplicación en el mismo dominio que otra aplicación, pero con un puerto diferente (es decir, midominio.com configuró la cookie original mientras se ejecutaba la aplicación con errores en mydomain.com:123) Ahora aparentemente Chrome envió la cookie incorrecta para que la protección CSRF no pudiera vincular el token a la sesión correcta.
Solución: borre todas las cookies para el dominio en cuestión, asegúrese de no ejecutar múltiples aplicaciones en el mismo dominio con diferentes puertos.
Esto parece ser un problema cuando se utiliza el arranque, a menos que esté procesando el formulario mediante {{form (form)}}. Además, los problemas parecen ocurrir solo en input type = "hidden". Si inspecciona la página con el formulario, encontrará que la entrada oculta no forma parte del marcado o que se está procesando pero no se ha enviado por algún motivo. Como se sugirió anteriormente, agregando {{form_rest (form)}} o envolviendo la entrada como a continuación debería hacer el truco.
<div class="form-group">
<input type="hidden" name="_csrf_token" value="{{ csrf_token(''authenticate'') }}">
</div>
Esto sucede porque los formularios por defecto contienen protección CSRF, que no es necesaria en algunos casos.
Puede deshabilitar esta protección CSRF en su clase de formulario en el método getDefaultOptions
como este:
// Other methods omitted
public function getDefaultOptions(array $options)
{
return array(
''csrf_protection'' => false,
// Rest of options omitted
);
}
Si no desea deshabilitar la protección CSRF, entonces debe representar el campo de protección CSRF en su forma. Se puede hacer usando {{ form_rest(form) }}
en su archivo de vista, así:
<form novalidate action="{{path(''signup_index'')}}" method="post" {{form_enctype(form)}} role="form" class="form-horizontal">
<!-- Code omitted -->
<div class="form-group">
<div class="col-md-1 control-label">
<input type="submit" value="submit">
</div>
</div>
{{ form_rest(form) }}
</form>
{{ form_rest(form) }}
representa todos los campos que no ha ingresado manualmente.
Necesita agregar la _token
en su forma, es decir,
{{ form_row(form._token) }}
Por el momento, su formulario no tiene el campo de token CSRF. Si usa las funciones de formulario twig para representar su formulario como form(form)
esto representará automáticamente el campo de token CSRF, pero su código muestra que está procesando su formulario con HTML sin formato como <form></form>
, por lo que tiene que renderizar manualmente el campo.
O simplemente, agregue {{ form_rest(form) }}
antes de la etiqueta de cierre del formulario.
De acuerdo con los documentos
Esto representa todos los campos que aún no se han procesado para el formulario dado. Es una buena idea tener siempre esto en algún lugar dentro de su formulario, ya que representará campos ocultos para usted y hará que los campos que olvidó representar sean más obvios (ya que representará el campo para usted).
Si ha convertido su formulario de HTML simple a twig, asegúrese de no perder la eliminación de una etiqueta de cierre </form>
. Error tonto, pero como descubrí que es una posible causa de este problema.
Cuando recibí este error, no pude resolverlo al principio. Estoy usando form_start()
y form_end()
para generar el formulario, por lo que no debería tener que agregar explícitamente el token con form_row(form._token)
, o usar form_rest()
para obtenerlo. Ya debería haber sido agregado automáticamente por form_end()
.
El problema era que la vista con la que estaba trabajando era una que había convertido de HTML sin formato a twig, y me había olvidado de eliminar la etiqueta de cierre </form>
, así que en lugar de:
{{ form_end(form) }}
Tuve:
</form>
{{ form_end(form) }}
Eso en realidad parece algo que podría arrojar un error, pero aparentemente no es así, así que cuando form_end()
genera form_rest()
, el formulario ya está cerrado. El origen de la página generada real del formulario era así:
<form>
<!-- all my form fields... -->
</form>
<input type="hidden" id="item__token" name="item[_token]" value="SQAOs1xIAL8REI0evGMjOsatLbo6uDzqBjVFfyD0PE4" />
</form>
Obviamente, la solución es eliminar la etiqueta de cierre adicional y tal vez beber un poco más de café.
También puede ver este mensaje de error, si su formulario tiene muchos elementos.
Esta opción en php.ini causa del problema
; How many GET/POST/COOKIE input variables may be accepted
max_input_vars = 1000
El problema es que _token pierde la solicitud PUT (GET). Entonces, puede aumentar el valor.
Además, se trata de archivos grandes. Aumentando el
upload_max_filesize
la opción resolverá el problema
Tuve el mismo error, pero en mi caso el problema era que mi aplicación estaba usando múltiples dominios de primer nivel, mientras que la cookie estaba usando uno. La eliminación de cookie_domain: ".%domain%"
de framework.session
en config.yml
provocó que las cookies config.yml
de manera predeterminada el dominio en el que estaba el formulario, y que resolvió el problema.
Tuve este error recientemente. Resulta que mi configuración de cookies era incorrecta en config.yml. Al agregar las configuraciones cookie_path
y cookie_domain
a framework.session
arregló.
Tuve este problema con un comportamiento extraño: borrar el caché del navegador no lo solucionó, pero borrar las cookies (es decir, la cookie de identificación de sesión PHP) resolvió el problema.
Esto tiene que hacerse después de que haya verificado todas las otras respuestas, incluida la verificación de que tiene el token en un campo de entrada de formulario oculto.