> Faqs > ¿Para qué sirve el token CSRF en Formularios HTML?

¿Para qué sirve el token CSRF en Formularios HTML?

¡Hola a todos! Soy nuevo en HTML, así que hoy estaba aprendiendo formularios HTML y asegurándolos con tokens CSRF.

Mi pregunta es, si alguien puede ver el token en el navegador al ver la fuente de la página, ¿cuál es la ventaja de usarlos? ? ¿Me perdí algo aquí?

Respuestas

Los token CSRF permiten prevenir un frecuente agujero de seguridad de las aplicaciones web llamado "Cross Site Request Forgery". En español sería algo como "falsificación de petición en sitios cruzados" o simplemente falsificación de solicitud entre sitios.

Básicamente es un ataque de seguridad que permite modificar el estado del servidor haciéndose pasar por un usuarioo determinado. El sitio web confia en el el usuario pero la petición no es real y está siendo falsificada por el atacante. Como el sitio web confía en el usuario, realiza una operación solicitada y la procesa como si se tratase del usuario real.

Este ataque CSRF se puede producir fácilmente. Veamos un ejemplo:

  1. Un usuario tiene una cuenta logeada en un sitio web llamemos "A".
  2. El usuario navega por otra página web (llamemos "B") y esta página produce un envío de datos hacia "A". Esa solicitud se puede realizar de manera arbitraria, con cualquier conjunto de datos que el atacante quiera, por método POST si lo desea. Como estas solicitudes se pueden generar desde Javascript, el sitio web "B" puede realizar cualquier número de ellas hacia cualquier sitio.
  3. La solicitud "falsificada", realizada de manera arbitraria desde "B" a "A" llega al servidor "A", que detecta que el usuario que estaba autenticado previamente, por lo que confía en él y la procesa convenientemente.

Pensemos en la página de un banco. Si el usuario estaba autenticado en el banco y navega por un sitio web atacante que realice solicitudes a la página del banco, como el usuario está previamente autenticado, el banco detectará que es de un cliente autenticado y por lo tanto realizará las operaciones que se le soliciten.

Aquí es donde el token CSRF sirve de ayuda. Este token es generado con cada solicitud en la página del banco, realizada por el usuario en el que confía. En cada formulario que luego el usuario envía, por ejemplo para hacer una transferencia, debe incluir ese token generado, de modo que el banco sabe que la solicitud fue iniciada realmente desde su sitio web, por la persona real.

El sitio web atacante no puede obtener los token generados inicialmente por el banco. Esos token llegan al navegador del cliente y el atacante no sería capaz de leerlos mediante Javascript, por la protección CSS (Cross-site scripting) que implementa el lenguaje Javascript. Por lo tanto la generación de los token es algo que se queda entre la página del banco y el usuario real, y no puede utilizarse para validar nuevas solicitudes desde otros lugares.

En general, hay muchos medios de producir este tipo de ataques y se pueden realizar sin siquiera intervención del usuario por ejemplo mediante Ajax por Javascript.

El token CSRF mejora la seguridad porque permite validar que las solicitudes son generadas desde el sitio web autorizado y no desde otras fuentes. Para ello se genera una cadena aleatoria y encriptada, que es capaz de ofrecer información solamente al servidor que la ha generado, que una vez procesada sirve para validar la procedencia de la solicitud y el usuario que la ha realizado. En los formularios se entrega generalmente ese token mediante un input hidden, con lo cual el servidor puede validar el token antes de procesar cualquier solicitud.

Pero generalmente es el motivo por el que se aconseja hacer todas las solicitudes que vayan a producir cambios en el servidor mediante POST, porque generalmente el framework de turno tiene implementada esta protección de CSRF en todas las solicitudes POST. Sabe que tiene que validar la solicitud. A veces el token se envía como input hidden, pero si la solicitud llega desde Javascript por Ajax también puede enviarse mediante las headers del HTTP.

Julian
499 17 39 31