Sin Validación de Inputs
Datos enviados por el usuario pasados directo a bases de datos o APIs externas sin ninguna validación de tipo, formato o contenido.
Cómo Funciona
Cuando pasas req.body directo a una query de base de datos o llamada a API, el atacante controla la forma y contenido de esos datos. Esto habilita SQL injection, NoSQL injection, bugs de confusión de tipos y comportamiento inesperado. El código generado por IA es especialmente propenso a esto — suele saltarse la validación por brevedad.
// MAL: body directo a la base de datos
export async function POST(req: Request) {
const body = await req.json();
const user = await db.users.create({ data: body });
return Response.json(user);
}// BIEN: valida con Zod antes de tocar la DB
const schema = z.object({
name: z.string().min(1).max(100),
email: z.string().email(),
});
export async function POST(req: Request) {
const body = schema.parse(await req.json());
const user = await db.users.create({ data: body });
return Response.json(user);
}Ejemplo Real
Error clásico del vibecoder: la IA genera una API route que desestructura req.body y lo pasa al create() de Prisma. Si la tabla users tiene un campo role, el atacante puede enviar role: 'admin' y escalar privilegios al instante.
Cómo Prevenirlo
- Usa Zod, Joi o Yup para validar cada request body y query param de tu API
- Define explícitamente qué campos se permiten — nunca pases el body completo a un ORM
- Valida tipos, longitudes, formatos y rangos — no solo si el campo existe
- Devuelve 400 con un mensaje claro en caso de fallo de validación, no 500
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.
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.
Lógica de Auth Solo en Frontend
highMostrar u ocultar elementos de UI basándose en el rol del usuario en React, sin ninguna validación server-side — fácilmente bypasseable abriendo DevTools.