🧠 ¿Qué es Cross-Site Request Forgery (CSRF)?
El Cross-Site Request Forgery (CSRF) es un ataque en el que un atacante engaña a un usuario autenticado para que ejecute acciones no deseadas en una aplicación web, sin su conocimiento o consentimiento.
🔐 Este tipo de ataque es peligroso porque se aprovecha de la confianza que una aplicación tiene en el navegador del usuario, lo que puede llevar a acciones maliciosas, como cambios de contraseñas o transferencias de dinero.
⚠️ Consecuencias de un ataque CSRF
- Cambio de datos sensibles: Un atacante puede hacer que un usuario cambie su contraseña, dirección de correo electrónico o cualquier otra información personal.
- Transacciones no autorizadas: El atacante puede forzar transacciones, como transferencias de dinero o compras de productos, sin que el usuario se entere.
- Alteración de configuraciones: Un atacante puede cambiar configuraciones de la cuenta de un usuario o incluso eliminar cuentas.
🛠️ ¿Cómo ocurre un ataque CSRF?
Un ataque CSRF generalmente ocurre cuando un atacante crea un enlace o formulario malicioso que se envía automáticamente a la aplicación objetivo, utilizando las credenciales de un usuario autenticado.
Por ejemplo, un atacante podría crear un enlace como:
htmlCopiarEditar<img src="https://tuapp.com/cambiarContraseña?newPassword=123456" />
Si el usuario está autenticado en la aplicación y visita la página maliciosa, el navegador enviará una solicitud de cambio de contraseña, sin que el usuario lo sepa.
🔒 Cómo prevenir los ataques CSRF
1. Uso de tokens CSRF
Una de las mejores formas de prevenir CSRF es utilizar tokens CSRF en los formularios y en las solicitudes que modifican el estado del servidor.
Un token CSRF es un valor único y aleatorio que se genera en el servidor y se incluye en los formularios. Este token debe ser enviado con cada solicitud para verificar que la solicitud proviene de una fuente confiable.
📌 Ejemplo en PHP:
phpCopiarEditar// Generar token CSRF
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
// Incluir token en el formulario
echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">';
Luego, en el servidor, se verifica si el token enviado coincide con el que se ha almacenado en la sesión del usuario:
phpCopiarEditarif ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die("Solicitud no válida");
}
2. Validar la fuente de las solicitudes
Es importante asegurarse de que las solicitudes provengan de fuentes legítimas. Para esto, puedes verificar el referer de las solicitudes HTTP.
📌 Ejemplo en PHP:
phpCopiarEditarif ($_SERVER['HTTP_REFERER'] !== "https://tuapp.com") {
die("Referer no válido");
}
Sin embargo, ten en cuenta que algunos navegadores pueden bloquear el encabezado Referer
por razones de privacidad, por lo que esta técnica debe ser complementada con otras medidas.
3. Usar métodos HTTP seguros
Siempre que sea posible, utiliza métodos HTTP seguros como POST para acciones sensibles, en lugar de GET. Esto evitará que las solicitudes se realicen accidentalmente a través de enlaces maliciosos.
4. Verificación de los encabezados de origen (Origin Header)
El encabezado Origin es una cabecera HTTP que indica el origen de una solicitud. Puedes verificar que este encabezado coincida con el dominio de tu aplicación para asegurar que la solicitud provenga de una fuente legítima.
📌 Ejemplo en PHP:
phpCopiarEditarif ($_SERVER['HTTP_ORIGIN'] !== "https://tuapp.com") {
die("Origen no válido");
}
5. Implementar SameSite para las cookies
La propiedad SameSite de las cookies es una medida de seguridad que asegura que las cookies solo se envíen en solicitudes del mismo origen.
La opción SameSite=Strict es la más segura, ya que no permite que las cookies se envíen en solicitudes de otros dominios.
📌 Ejemplo en PHP:
phpCopiarEditarsetcookie("session", $session_id, time()+3600, "/", "", true, true, ['SameSite' => 'Strict']);
🔐 Otras medidas de seguridad
1. Autenticación multifactor (MFA)
Implementa un sistema de autenticación multifactor para asegurarte de que incluso si un atacante obtiene acceso a las credenciales de un usuario, no podrá realizar acciones sin el segundo factor de autenticación.
2. Validación de las acciones sensibles
Antes de realizar cualquier acción sensible (como cambiar contraseñas, realizar pagos, etc.), asegúrate de que el usuario confirmó su acción a través de un mecanismo adicional, como una verificación por correo electrónico o una contraseña adicional.
🧪 Cómo testear vulnerabilidades CSRF
- Pruebas manuales: Intenta enviar solicitudes maliciosas desde dominios diferentes a tu aplicación para ver si el sistema verifica correctamente los tokens CSRF.
- Herramientas automáticas: Usa herramientas como OWASP ZAP o Burp Suite para detectar vulnerabilidades CSRF en tu aplicación.
- Monitoreo de logs: Revisa los logs de tu servidor para detectar solicitudes inusuales o sin el token CSRF.
📚 Recursos Recomendados (Formato Redescarga)
Tipo | Recurso / Enlace |
---|---|
📘 Guía | OWASP CSRF Prevention Cheat Sheet |
🎥 Video | «Understanding CSRF Attacks» – OWASP Foundation |
📦 Herramienta | OWASP ZAP – Herramienta de pruebas de seguridad |
🧪 Artículo | How to Prevent CSRF Attacks |
✅ Conclusión
El Cross-Site Request Forgery (CSRF) es un ataque devastador, pero con medidas como el uso de tokens CSRF, validación de origen de solicitudes y la implementación de SameSite en las cookies, puedes proteger tu aplicación y mantener la seguridad de tus usuarios.
💡 No subestimes los ataques CSRF, implementa estas prácticas y refuerza la seguridad de tu aplicación web.
Deja una respuesta