Skip to content

Plataforma técnica · Seguridad

Buenas Prácticas de Seguridad

Seguridad

Las buenas prácticas de seguridad son criterios de aceptación para desarrollo. Cada endpoint, servicio o migración debe declarar cómo autentica, autoriza, valida datos, preserva tenant scope y evita exposición de información sensible.

Secretos fuera del repositorio

Credenciales, tokens, llaves privadas y archivos .env se administran por variables de entorno y nunca se versionan.

Entrada validada

Todo payload externo se valida con express-validator, esquema dedicado o validación equivalente antes de invocar servicios.

SQL parametrizado

Las consultas usan parámetros ($1, $2) o builders compartidos. No se concatenan entradas de usuario en SQL.

Logs mínimos

Los logs deben explicar el fallo sin incluir contraseñas, tokens, RUT reales, remuneraciones ni datos financieros críticos.

ÁreaCriterio de aceptación
AutenticaciónToda ruta protegida usa authenticateToken antes del handler
AutorizaciónOperaciones sensibles usan authorizeRoute, requireRole o regla funcional explícita
Tenant scopeLa ruta resuelve tenant desde usuario o contexto autorizado; no confía en tenant_id arbitrario
ValidaciónQuery, params y body rechazan tipos inválidos, campos faltantes y rangos fuera de contrato
SQLNo existe interpolación de entradas externas dentro de strings SQL
AuditoríaMutaciones críticas registran evento o quedan cubiertas por auditMiddleware
Datos sensiblesEjemplos, fixtures, logs y errores usan placeholders o valores redactados
ErroresLas respuestas no revelan stack traces, secretos ni estructura interna innecesaria
DependenciasCambios de paquetes pasan por revisión y no introducen vulnerabilidades críticas conocidas
  1. Montar authenticateToken a nivel de router o ruta individual.
  2. Agregar requireRole o authorizeRoute cuando la operación no sea lectura básica.
  3. Validar params, query y body antes de construir comandos de dominio.
  4. Resolver tenant desde req.user o desde un helper autorizado.
  5. Ejecutar servicios de dominio sin exponer detalles de infraestructura al cliente.
  6. Registrar auditoría para mutaciones, exportaciones, denegaciones o cambios de configuración.
routes/admin/example.ts
router.use(authenticateToken);
router.post(
'/',
requireRole(['ADMIN', 'SUPER_ADMIN']),
[
body('name').isString().trim().notEmpty(),
body('status').optional().isBoolean(),
],
async (req: AuthenticatedRequest, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({
success: false,
error: 'Validation Error',
errors: errors.array(),
});
}
const result = await service.create({
tenantId: req.user?.tenantId,
input: req.body,
});
return res.status(201).json({ success: true, data: result });
},
);
CasoRespuesta esperada
Sin token401 con error genérico de autenticación
Sesión vencida o revocada401, limpieza de cookie y mensaje sin detalles internos
Rol insuficiente403 con recurso o rol requerido solo si no expone información sensible
Entrada inválida400 con errores de validación controlados
Error de dominioCódigo específico del dominio sin stack trace
Error inesperado500 genérico y detalle solo en logs internos sanitizados

Antes de cerrar un cambio, revisar explícitamente:

Tipo de datoAcción esperada
Contraseñas y tokensNunca se retornan, registran ni guardan en texto plano
RUT y datos personalesSe usan placeholders en documentación y fixtures
RemuneracionesSe tratan como dato crítico y no se exponen en logs
Reportes financierosSe protegen con rol, tenant scope y auditoría
ExportacionesSe registran como evento auditable cuando contienen datos confidenciales