¿Las llamadas AJAX están en alcance de ciertos tipos de protección como por ejemplo contra CSRF?
Sí, lo están. Las llamadas AJAX (tanto las "simples" con GET y POST como las "complejas" con PUT, DELETE, etc.) están completamente dentro del alcance de la protección contra CSRF (Cross-Site Request Forgery).
De hecho, sin las protecciones adecuadas, las llamadas AJAX pueden ser un vector muy efectivo para ataques CSRF.
¿Por qué las llamadas AJAX son vulnerables a CSRF?
El ataque CSRF se basa en la forma en que los navegadores web manejan las cookies:
El navegador envía automáticamente las cookies: Cuando un usuario está logueado en un sitio (banco.com) y tiene una sesión activa (con cookies de sesión guardadas en su navegador), si ese mismo navegador hace una solicitud a banco.com (ya sea por una acción directa del usuario, un formulario HTML o una llamada AJAX), el navegador siempre enviará automáticamente las cookies de sesión válidas para banco.com junto con la solicitud.
El servidor confía en las cookies: El servidor de banco.com recibe la solicitud, ve las cookies de sesión válidas y asume que la solicitud proviene de un usuario autenticado y legítimo, por lo que procede a ejecutar la acción.
Aquí es donde entra AJAX: un atacante puede engañar al navegador de un usuario logueado para que ejecute JavaScript en una página maliciosa (sitio-malicioso.com). Este JavaScript puede construir y enviar una solicitud AJAX a banco.com. Como el navegador ya está logueado en banco.com, automáticamente adjuntará las cookies de sesión, y la solicitud parecerá legítima para el servidor de banco.com.
¿Cómo se protegen las llamadas AJAX contra CSRF?
La protección principal contra CSRF para llamadas AJAX es la misma que para los formularios HTML tradicionales: los tokens CSRF.
Así es como funciona en la práctica en frameworks como Laravel:
El servidor genera un token CSRF: Cuando Laravel renderiza una vista (tu página HTML), genera un token CSRF único por sesión y lo incrusta en la página. Comúnmente, lo encontrarás en una meta etiqueta (<meta name="csrf-token" content="...">) o en un campo oculto de un formulario.
JavaScript recupera el token: Tu código JavaScript (usando librerías como Axios, jQuery AJAX, o la API fetch) debe ser configurado para leer este token de la meta etiqueta o del DOM.
JavaScript incluye el token en la solicitud AJAX: Antes de enviar la solicitud AJAX, tu JavaScript añade este token al request. La forma más común es enviarlo en un encabezado HTTP personalizado (por ejemplo, X-CSRF-TOKEN).
Ejemplo con Axios (por defecto en Laravel): Si usas Axios en un proyecto Laravel, ya viene configurado para leer la meta etiqueta csrf-token y enviarlo automáticamente en el encabezado X-XSRF-TOKEN (Laravel también busca X-XSRF-TOKEN además de X-CSRF-TOKEN).
El servidor verifica el token: Cuando la solicitud AJAX llega al servidor, el middleware de CSRF de Laravel (el mismo que protege tus formularios HTML) intercepta la petición. Compara el token recibido en el encabezado (o en el cuerpo de la solicitud) con el token que tiene en la sesión del usuario.
Decisión del servidor:
Si los tokens coinciden, la solicitud se considera legítima y se procesa.
Si los tokens no coinciden, la solicitud se considera un ataque CSRF y se bloquea (normalmente con un error HTTP 419 Page Expired o 403 Forbidden).
Por qué el token CSRF es efectivo contra AJAX CSRF:
El atacante que opera desde sitio-malicioso.com no puede:
Leer la cookie del token CSRF: La Política del Mismo Origen (SOP) lo impide.
Leer el contenido de la página HTML de banco.com: La SOP lo impide, por lo que no puede extraer el token de la meta etiqueta.
Añadir el token al encabezado o cuerpo de su solicitud AJAX forjada: Como no puede leerlo, no puede incluir el token válido.
Por lo tanto, cualquier solicitud AJAX forjada que intente enviar el atacante desde sitio-malicioso.com llegará sin el token CSRF válido, y tu servidor la rechazará.
En resumen:
Sí, las llamadas AJAX son vulnerables a CSRF. La protección se implementa eficazmente mediante el uso de tokens CSRF, que tu JavaScript debe incluir en las solicitudes AJAX (típicamente en un encabezado HTTP) para que el servidor pueda verificarlas. Esto asegura que solo las solicitudes iniciadas por tu propia aplicación (donde el token es conocido) sean procesadas.
No hay comentarios:
Publicar un comentario