mediumCWE-400

Timeout de Conexión a BD Faltante

Tu conexión a base de datos no tiene timeout configurado, así que una base de datos lenta o sin respuesta dejará tu aplicación entera colgada indefinidamente en lugar de fallar rápido.

Cómo Funciona

Sin timeouts de conexión, una sola consulta lenta puede mantener una request HTTP abierta por minutos, agotando el pool de hilos o el límite de concurrencia de funciones de tu servidor. Si la base de datos no responde (partición de red, sobrecarga), cada request entrante se cuelga, cascadeando rápidamente a una interrupción completa de la aplicación. El comportamiento de fallo rápido — devolver un error rápidamente — siempre es mejor que esperar indefinidamente.

Código Vulnerable
// MAL: sin timeouts configurados — se cuelga indefinidamente en BD lenta
const pool = new Pool({
  connectionString: process.env.DATABASE_URL
  // Sin connectionTimeoutMillis, sin statement_timeout, sin query_timeout
});
Código Seguro
// BIEN: configura timeouts tanto a nivel del pool como de la consulta
const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
  connectionTimeoutMillis: 3000, // falla si no puede conectar en 3s
  statement_timeout: 10000,      // cancela consultas que corren más de 10s
  query_timeout: 10000           // timeout de consulta del lado del cliente
});

Ejemplo Real

Una app SaaS popular experimentó una interrupción completa cuando el lag de su réplica de base de datos se disparó durante una migración. Sin timeouts, todas las 500 requests concurrentes quedaron colgadas esperando respuestas que nunca llegaron, agotando el límite de ejecución concurrente de Vercel y devolviendo errores 504 a todos los usuarios durante 20 minutos.

Cómo Prevenirlo

  • Configura connectionTimeoutMillis (cuánto tiempo esperar por una conexión del pool) a 2-5 segundos
  • Configura statement_timeout a nivel de sesión PostgreSQL para cancelar consultas desbocadas
  • Implementa patrones de circuit breaker para llamadas a la base de datos en rutas de código críticas
  • Usa timeouts a nivel de aplicación (AbortController en fetch, Promise.race con timeout) como medida adicional
  • Configura lock_timeout en PostgreSQL para prevenir que la contención de locks bloquee indefinidamente

Tecnologías Afectadas

Node.jsPythonGo

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas