Seguridad al programar: el OWASP Top 10 explicado
Los fallos de seguridad más graves en aplicaciones web y los hábitos que los evitan desde el primer proyecto.
En cuanto tu código recibe datos de otras personas (un formulario, una URL, un archivo subido) tiene que asumir que alguien intentará abusar de él. La OWASP (Open Worldwide Application Security Project) es una fundación sin ánimo de lucro que publica el Top 10, la lista de referencia de los riesgos más importantes en aplicaciones web. La edición más reciente es la de 2025. Conocerla desde el principio te ahorra cometer los errores que más se explotan.
La lista de 2025, en castellano llano
| N.º | Riesgo (nombre oficial) | En pocas palabras |
|---|---|---|
| A01 | Broken Access Control | Un usuario puede ver o cambiar lo que no es suyo |
| A02 | Security Misconfiguration | Configuraciones por defecto, modos de depuración o permisos abiertos |
| A03 | Software Supply Chain Failures | Bibliotecas o herramientas de terceros comprometidas o sin actualizar |
| A04 | Cryptographic Failures | Datos sensibles sin cifrar o mal cifrados |
| A05 | Injection | Datos del usuario interpretados como código (SQL, comandos, HTML) |
| A06 | Insecure Design | Fallos de planteamiento, no de una línea concreta |
| A07 | Authentication Failures | Inicios de sesión débiles o fáciles de forzar |
| A08 | Software or Data Integrity Failures | Confiar en código o datos sin comprobar que no se han alterado |
| A09 | Security Logging and Alerting Failures | No registrar ni detectar lo que está pasando |
| A10 | Mishandling of Exceptional Conditions | Errores mal gestionados que dejan el sistema en un estado inseguro |
Control de acceso: el número uno
El ejemplo clásico: tu web muestra una factura en /factura?id=1041. Si alguien cambia el número a 1042 y ve la factura de otra persona, el control de acceso está roto. La regla es comprobar en el servidor, en cada petición, que ese usuario tiene permiso sobre ese recurso concreto. Ocultar un botón en la página no protege nada: cualquiera puede escribir la URL a mano o llamar a tu API directamente.
Inyección: nunca mezcles datos y código
Pasa cuando un texto del usuario acaba ejecutándose:
- Inyección SQL: se evita con consultas parametrizadas, nunca pegando texto en el SQL. Lo tienes explicado en la guía de bases de datos y SQL.
- XSS (cross-site scripting): alguien escribe
<script>…</script>en un comentario y tu página lo muestra tal cual, de modo que el código se ejecuta en el navegador de otros visitantes. En JavaScript, inserta texto contextContenty no coninnerHTML; los motores de plantillas de los frameworks escapan el HTML por defecto, no desactives esa protección. - Inyección de comandos: no pases texto del usuario a la terminal del sistema (
os.system,exec) sin validarlo.
Contraseñas y datos sensibles
- Nunca guardes contraseñas en texto plano ni con un simple hash como MD5 o SHA-256: usa funciones pensadas para contraseñas, como bcrypt, scrypt o Argon2, que las bibliotecas de autenticación de tu framework ya implementan.
- Usa siempre HTTPS (el candado del navegador).
- Limita los intentos de inicio de sesión y ofrece verificación en dos pasos.
- No guardes datos que no necesitas: lo que no tienes no se puede filtrar.
Para entender por qué todo esto funciona, repasa qué es el cifrado.
Dependencias y configuración
En 2025 la cadena de suministro de software sube al tercer puesto: amplía la antigua categoría de componentes vulnerables o desactualizados e incluye también los compromisos en dependencias, sistemas de compilación y canales de distribución, y fue la preocupación más votada en la encuesta a la comunidad. Tu aplicación es tan segura como las bibliotecas que usa.
- Instala paquetes solo de los registros oficiales y comprueba el nombre exacto (cuidado con imitaciones como
reqeusts). - Fija las versiones en
requirements.txtopackage-lock.jsony actualiza cuando salgan parches de seguridad.npm auditypip-auditrevisan vulnerabilidades conocidas. - Nunca subas claves ni contraseñas al repositorio: usa variables de entorno y
.gitignore. - En producción, desactiva el modo de depuración: los mensajes de error detallados le enseñan al atacante cómo está hecha tu aplicación.
Hábitos que evitan la mayoría de problemas
- Valida en el servidor todo lo que llega: tipo, longitud y formato. La validación del navegador es comodidad para el usuario, no seguridad.
- Mínimo privilegio: cada usuario, proceso y base de datos con los permisos justos.
- Usa lo que ya existe: autenticación, cifrado y sesiones de tu framework, no inventes tu propio sistema.
- Gestiona los errores: que un fallo inesperado deje la operación cancelada, no a medias, y que se registre para poder investigarlo.
- Revisa el código ajeno, incluido el que te proponga una IA: puede contener exactamente estos fallos. Lo verás en IA para programar.
La web del OWASP Top 10 explica cada riesgo con ejemplos de ataques y medidas de prevención. Está en inglés, pero es la referencia que usan los profesionales y los ciclos de formación.
Fuentes consultadas
- OWASP Top 10:2025 (OWASP Foundation)
- Introducción al OWASP Top 10:2025 (qué ha cambiado) (OWASP Foundation)
- Seguridad en la web (MDN Web Docs (Mozilla))
- sqlite3: cómo usar marcadores de posición (Python Software Foundation)
