Audité mis proyectos personales en busca de seguridad — esto es lo que encontré
Hace poco audité todos mis proyectos personales. Revisé mis backends de FastAPI, bots de Telegram y aplicaciones web. Pensaba que era cuidadoso.
Me equivoqué.
Encontré errores reales que de hecho envié a producción. No son problemas teóricos. Son errores que cometí mientras intentaba avanzar rápido.
Estos son los principales problemas que encontré y cómo solucionarlos:
- Autenticación condicional Escribí código que solo verificaba las API keys si existía un secreto. Si olvidaba configurar el secreto en mi entorno, la verificación se omitía por completo. Esto dejaba mi API abierta para todo el mundo.
- Solución: Nunca hagas que la autenticación sea condicional. Si falta el secreto, la aplicación debe lanzar un error y detenerse.
- Filtración de claves en el historial de Git Encontré claves de API antiguas en mi historial de Git. Más tarde las había movido a archivos .env, pero Git conserva cada versión antigua de tu código para siempre.
- Solución: Trata cualquier clave que haya sido subida a Git como comprometida. Revócala inmediatamente. Usa herramientas como
git-filter-repopara limpiar tu historial.
- Endpoints de depuración residuales Dejé endpoints en producción que mostraban mi configuración de base de datos y los ajustes del sistema. Son útiles durante el desarrollo, pero peligrosos en un entorno real.
- Solución: Añade la eliminación de endpoints de depuración a tu lista de verificación de despliegue.
- Mensajes de error detallados Estaba devolviendo errores de sistema sin procesar al usuario. Estos errores revelan tus rutas de archivos, tipos de base de datos y versiones de librerías. Un atacante puede usar estos datos para atacar tu sistema.
- Solución: Registra el error completo internamente para ti. Devuelve un mensaje genérico de "Internal Server Error" al cliente.
- XSS mediante innerHTML
Usé
innerHTMLpara renderizar datos de usuario en mi frontend. Esto permite que los atacantes inyecten scripts en tu sitio.
- Solución: Sanea siempre los datos o usa
textContenten lugar deinnerHTML.
- Falta de Rate Limiting Tenía endpoints que llamaban a modelos de IA costosos sin límites. Un solo usuario podría generar una factura enorme en cuestión de minutos.
- Solución: La autenticación detiene a los usuarios no autorizados. El rate limiting detiene a los usuarios autorizados de abusar de tu sistema. Necesitas ambos.
- Configuración de CORS permisiva
Usé
allow_origins=["*"]en mi middleware. Esto permite que cualquier sitio web realice peticiones a tu API.
- Solución: En producción, permite únicamente tus dominios específicos.
- Fuga de archivos Escribí código que creaba archivos temporales pero no lograba eliminarlos si el proceso fallaba. Estos archivos permanecen en tu servidor para siempre.
- Solución: Usa un bloque try-finally para asegurar que los archivos se eliminen incluso si ocurre un error.
Los problemas de seguridad rara vez son intencionales. Son el resultado de decir "arreglaré esto más tarde". El "más tarde" nunca llega.
Integra la seguridad en tu flujo de trabajo desde el primer día. Revisa tu código antes de hacer un commit y antes de desplegar.
Fuente: https://dev.to/justjinoit/i-audited-my-own-side-projects-for-security-issues-heres-what-i-found-1ahb