Codea Seguro Codea Seguro
Desarrollo Seguro Dificultad: basica

Checklist de validación de entrada

Cómo validar y sanear la entrada del usuario para prevenir inyecciones y errores.

Toda entrada que cruza un límite de confianza (usuario, API externa, archivo) debe tratarse como hostil hasta demostrar lo contrario. Esta checklist resume las defensas mínimas.

1. Valida en el servidor

La validación en el cliente mejora la UX, pero nunca es una barrera de seguridad. Repite siempre la validación en el backend.

2. Prefiere listas de permitidos (allow-list)

Define qué es válido en lugar de intentar bloquear lo malo:

const ROLES = ['admin', 'editor', 'lector'] as const;

function parseRol(input: string) {
  if (!ROLES.includes(input as (typeof ROLES)[number])) {
    throw new Error('Rol no permitido');
  }
  return input;
}

3. Usa consultas parametrizadas

Nunca concatenes entrada en una consulta. Deja que el driver separe código de datos:

// MAL — vulnerable a inyección SQL
db.query(`SELECT * FROM users WHERE email = '${email}'`);

// BIEN — consulta parametrizada
db.query('SELECT * FROM users WHERE email = $1', [email]);

4. Codifica en la salida según el contexto

La misma cadena se escapa distinto en HTML, en un atributo, en una URL o en JS. Usa las utilidades del framework en lugar de escapar a mano.

Checklist rápida

  • Validación en el servidor, no solo en el cliente.
  • Allow-list para valores enumerables (roles, estados, tipos).
  • Consultas parametrizadas para toda interacción con la base de datos.
  • Codificación de salida según contexto.
  • Límites de tamaño y tipo en cada campo.