La seguridad web no consiste únicamente en colocar un certificado HTTPS o utilizar una contraseña. Es un proceso que debe estar presente en la arquitectura, el código, la gestión de usuarios, las dependencias y la infraestructura.
Los principios fundamentales
Estas son algunas de las reglas que conviene tener presentes en cualquier aplicación web.
Usar HTTPS
Toda comunicación entre el navegador y el servidor debe viajar mediante HTTPS para proteger los datos durante el tránsito.
Proteger credenciales
Las contraseñas y secretos no deben almacenarse directamente en el código ni exponerse en repositorios públicos.
Controlar el acceso
Cada usuario debe acceder únicamente a los recursos y operaciones que realmente necesita.
Validar entradas
Los datos recibidos desde formularios, URLs, APIs o cualquier cliente deben validarse antes de ser procesados.
Evitar confiar en el cliente
Las reglas de seguridad importantes deben comprobarse en el servidor, incluso si ya fueron verificadas en la interfaz.
Reducir la superficie de ataque
Mantener únicamente servicios, endpoints, permisos y dependencias necesarios ayuda a disminuir posibles puntos de entrada.
Nunca confíes completamente en la entrada
Uno de los errores más comunes es asumir que los datos enviados por el usuario son correctos.
Un formulario puede ser manipulado, una URL puede modificarse y una petición HTTP puede enviarse directamente sin utilizar la interfaz de la aplicación. Por eso, la validación importante debe realizarse también en el servidor.
const id = req.query.id;
db.query(
"SELECT * FROM users WHERE id = " + id
);const id = Number(req.query.id);
db.query(
"SELECT * FROM users WHERE id = ?",
[id]
);La idea no es únicamente evitar SQL Injection. Validar y normalizar las entradas ayuda a establecer límites claros sobre qué datos puede aceptar nuestro sistema.
Los secretos no pertenecen al repositorio
API keys, tokens, contraseñas y credenciales deben mantenerse fuera del código fuente.
Una buena práctica es utilizar variables de entorno y sistemas adecuados para administrar secretos. Además, nunca debemos asumir que un repositorio privado será siempre privado.
DATABASE_URL="..."
API_KEY="..."
JWT_SECRET="..."Importante: agregar un secreto al archivo de entorno no es suficiente. También debemos asegurarnos de que ese archivo no termine versionado accidentalmente.
Autenticación no es autorización
Saber quién es el usuario no significa que pueda hacer cualquier operación.
Autenticación
¿Quién eres?
Autorización
¿Qué puedes hacer?
Recurso
¿Qué puedes modificar?
Por ejemplo, un usuario autenticado podría tener permiso para consultar su perfil, pero no necesariamente para eliminar usuarios o modificar configuraciones administrativas.
Seguridad en cada capa
Una aplicación segura no depende de una única medida de protección.
Validación de formularios y manejo seguro de datos.
Autenticación, autorización y validación de peticiones.
Reglas de negocio y controles de acceso.
Consultas parametrizadas y permisos mínimos.
Servicios necesarios, actualizaciones y configuración segura.
Checklist antes de publicar
Una revisión rápida puede ayudarnos a detectar errores básicos antes de llevar una aplicación a producción.
Seguridad desde el diseño
La seguridad funciona mejor cuando forma parte del proceso de desarrollo desde el comienzo. Pensar en amenazas, permisos, validaciones y manejo de datos antes de escribir código puede evitar problemas mucho más costosos después.
