Mensajes de Error Verbosos
Mensajes de error detallados, stack traces o rutas internas enviados al cliente o logueados públicamente, dándole a los atacantes un mapa de tus internals.
Cómo Funciona
Los stack traces revelan rutas de archivos, versiones de librerías, nombres de funciones y a veces schemas de bases de datos. Un atacante que ve `Error: column 'password_hash' of relation 'users' does not exist` aprende la estructura de tu tabla. Los mensajes de error son reconocimiento gratuito.
// MAL: error crudo enviado al cliente
export async function POST(req: Request) {
try {
const user = await db.users.create({ data: await req.json() });
return Response.json(user);
} catch (error) {
return Response.json({ error: error.message, stack: error.stack }, { status: 500 });
}
}// BIEN: mensaje genérico al cliente, detalles a los logs
export async function POST(req: Request) {
try {
const user = await db.users.create({ data: await req.json() });
return Response.json(user);
} catch (error) {
console.error('[/api/users POST]', error); // solo en el servidor
return Response.json({ error: 'Algo salió mal' }, { status: 500 });
}
}Ejemplo Real
Una app Next.js en modo desarrollo fue deployada accidentalmente a producción. El overlay de errores detallado exponía stack traces completos incluyendo rutas absolutas de archivos e internals de Prisma a cualquier visitante que provocara un error.
Cómo Prevenirlo
- Devuelve mensajes de error genéricos a los clientes (ej. 'Algo salió mal') en producción
- Loguea errores detallados server-side con Sentry o logging estructurado — nunca en la respuesta
- Asegúrate de tener NODE_ENV=production en tu entorno de deployment para deshabilitar overlays de dev
- Nunca envíes stack traces, rutas de archivos o detalles de queries en las respuestas de tu API
Tecnologías Afectadas
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
API Keys Hardcodeadas
criticalAPI keys, tokens o secretos escritos directo en el código fuente, visibles para cualquiera con acceso al repo — incluyendo repos públicos de GitHub.
Sin Validación de Inputs
mediumDatos enviados por el usuario pasados directo a bases de datos o APIs externas sin ninguna validación de tipo, formato o contenido.
Contraseñas en Texto Plano
criticalContraseñas de usuarios guardadas como strings crudos en la base de datos en lugar de hashearse con bcrypt o Argon2.
JWT Sin Expiración
highJWTs firmados sin el claim `exp` que nunca expiran, lo que significa que un token robado da acceso permanente sin forma de revocarlo.