Token 'Recuérdame' Inseguro
Tokens persistentes de 'recuérdame' que son predecibles, no expiran o se guardan de forma insegura — permitiendo a atacantes falsificar tokens o mantener acceso indefinido.
Cómo Funciona
Los tokens remember-me son credenciales de larga vida guardadas en cookies. Si el token se deriva de datos predecibles (ID de usuario + timestamp), un atacante puede falsificar tokens válidos. Si los tokens nunca expiran o no se rotan en cada uso, un solo token robado concede acceso permanente. La implementación correcta requiere aleatoriedad criptográfica y rotación de tokens de un solo uso.
// MAL: token predecible basado en datos del usuario
function generarTokenRecuerdame(userId: string): string {
return Buffer.from(`${userId}:${Date.now()}`).toString('base64');
// ¡Predecible! El atacante puede computar tokens válidos
}// BIEN: criptográficamente aleatorio, guardado hasheado, rotado en cada uso
import { randomBytes, createHash } from 'crypto';
async function generarTokenRecuerdame(userId: string) {
const token = randomBytes(32).toString('hex');
const hash = createHash('sha256').update(token).digest('hex');
await db.rememberTokens.create({
data: { userId, tokenHash: hash, expiresAt: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000) }
});
return token; // envía esto al cliente
}Ejemplo Real
Las primeras apps PHP con tokens remember-me predecibles (md5(user_id + static_secret)) fueron ampliamente explotadas. Si un atacante conoce tus IDs de usuario (frecuentemente enteros secuenciales), puede falsificar cookies remember-me para cualquier cuenta.
Cómo Prevenirlo
- Usa tokens criptográficamente aleatorios (mínimo crypto.randomBytes(32))
- Guarda solo el hash del token en la base de datos, no el token crudo
- Configura una expiración razonable (máximo 30 días) y rota el token en cada uso
- Invalida todos los tokens remember-me al cambiar contraseña o cuando se detecta actividad sospechosa
Tecnologías Afectadas
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
Fijación de Sesión
highEl servidor reutiliza el mismo ID de sesión antes y después del login, permitiendo a un atacante que plantó un ID de sesión conocido secuestrar la sesión autenticada.
Sin Bloqueo de Cuenta / Protección contra Fuerza Bruta
mediumEndpoints de login sin rate limiting ni mecanismo de bloqueo, permitiendo a atacantes probar combinaciones ilimitadas de usuario y contraseña hasta encontrar credenciales válidas.
Política de Contraseña Débil
mediumSin requisitos de longitud mínima, complejidad o verificación contra contraseñas comunes en el registro o cambio de contraseña, haciendo las cuentas fácilmente vulnerables a fuerza bruta.
OAuth Sin Parámetro State
highFlujo de autorización OAuth implementado sin un parámetro `state` aleatorio, permitiendo ataques CSRF que vinculan la cuenta de una víctima con la identidad OAuth del atacante.