Documentación

Protección CSRF

la falsificación de petición entre sitios, abreviada CSRF. El objeto de este ataque es transmitir a un usuario autenticado una petición HTTP falsificada que apunte a una acción interna del sitio, para que la ejecute sin ser consciente de ello y utilizando sus propios derechos. El usuario se convierte así en cómplice de un ataque sin darse cuenta. Dado que el ataque está dirigido al usuario, se eluden un gran número de sistemas de autenticación.

ejemplo:

  • Supongamos que Alice es la administradora de un foro y que está conectada a él mediante un sistema de sesiones. Malorie es miembro de este mismo foro, quiere borrar uno de los mensajes del foro. Como no tiene los derechos necesarios con su cuenta, utiliza la cuenta de Alice gracias a un ataque de tipo CSRF.
  • Malorie manages to know the link that allows you to delete the message in question. Malorie sends a message to Alice containing a pseudo-image to display (which is actually a script). The image URL is the link to the script to delete the desired message.
  • Alice debe tener una sesión abierta en su navegador para el sitio objetivo de Malorie. Este es un requisito para que el ataque tenga éxito silenciosamente sin requerir una solicitud de autenticación que alertaría a Alice. Esta sesión debe tener los derechos necesarios para ejecutar la petición destructiva de Malorie. No es necesario que una pestaña del navegador esté abierta en el sitio objetivo o incluso que el navegador esté iniciado. Es suficiente con que la sesión esté activa.
  • Alice lee el mensaje de Malorie, su navegador utiliza la sesión abierta de Alice y no requiere autenticación interactiva. Intenta recuperar el contenido de la imagen. Al hacer esto, el navegador activa el enlace y borra el mensaje, recupera una página web de texto como contenido de la imagen. Al no reconocer el tipo de imagen asociada, no muestra ninguna imagen y Alice no sabe que Malorie acaba de hacerle borrar un mensaje contra su voluntad.

La estrategia es sencilla, basta con añadir una clave secreta en el formulario (sólo conocida por el sitio y no por el atacante) y comprobar la exactitud de esta clave al recibir el formulario.

lado formulario primera acción

Para añadir una clave y almacenarla en la sesión, existe una función twig para generar la entrada oculta necesaria, luego sólo hay que evitar que twig la neutralice con el filtro raw, así:

{{ getToken()|raw }}

Publicar las próximas acciones laterales

Ahora que se ha añadido una clave al formulario, debe comprobar que esta clave existe y que es válida.

Si es válido, entonces podemos procesar el formulario, si no, debemos... hacer algo más.

para comprobar si el token es válido, existe una función validadora, tal que así:

$tokenValid = $this->checkToken($_POST['token'] ?? "");
if ($_SERVER['REQUEST_METHOD'] === 'POST' && $tokenValid)

To complete this documentation there is always the example of the "item CRUD" provided by default in the mini-framework