mediumCWE-521A07:2021

Sin Política de Contraseñas

Aceptar cualquier contraseña — incluyendo '123' o 'a' — hace las cuentas de usuarios trivialmente vulnerables a credential stuffing y ataques de fuerza bruta.

Cómo Funciona

Sin un requisito mínimo de longitud y complejidad, los usuarios eligen contraseñas débiles y los atacantes pueden forzarlas con wordlists pequeñas. Las guías NIST (SP 800-63B) recomiendan mínimo 8 caracteres y verificar contra listas de contraseñas filtradas conocidas.

Código Vulnerable
// MAL: sin validación de contraseña — acepta '1' como contraseña válida
async function registrar(email: string, contrasena: string) {
  const hash = await bcrypt.hash(contrasena, 10);
  await db.users.create({ email, password: hash });
}
Código Seguro
// BIEN: aplica requisitos mínimos de contraseña
async function registrar(email: string, contrasena: string) {
  if (contrasena.length < 8) throw new Error('La contraseña debe tener al menos 8 caracteres');
  if (await isBreachedPassword(contrasena)) throw new Error('Contraseña encontrada en base de datos de brechas');
  const hash = await bcrypt.hash(contrasena, 10);
  await db.users.create({ email, password: hash });
}

Ejemplo Real

La brecha de LinkedIn de 2012 expuso 117 millones de hashes de contraseñas. El análisis mostró que 'linkedin' era la contraseña más común, y más de 1 millón de cuentas usaban '123456'. Una política básica de longitud hubiera forzado a la mayoría a contraseñas más fuertes.

Cómo Prevenirlo

  • Aplica una longitud mínima de contraseña de 8 caracteres (12+ recomendado)
  • Verifica las contraseñas contra la API de HaveIBeenPwned o el paquete npm haveibeenpwned
  • Permite contraseñas largas — no establezcas una longitud máxima menor a 64 caracteres
  • No requieras caracteres especiales — no mejoran mucho la seguridad y dañan la usabilidad

Tecnologías Afectadas

Node.jsjavascript

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas