Programación

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.

Los cinco primeros riesgos del OWASP Top 10:2025.A01 (Control de acceso roto) / A02 (Configuración insegura) / A03 (Fallos en la cadena de suministro) / A04 (Fallos criptográficos) / A05 (Inyección)POR CAPASOWASP Top 10:2025A01Control de acceso rotoA02Configuración inseguraA03Fallos en la cadena de suministroA04Fallos criptográficosA05Inyección
Los cinco primeros riesgos del OWASP Top 10:2025.

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 con textContent y no con innerHTML; 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.
Cómo evitar las inyecciones más comunes.Riesgo: Inyección SQL; XSS; Inyección de comandos. Prevención: Consultas con parámetros; textContent, no innerHTML; No pasar texto a la terminalCOMPARATIVARiesgoInyección SQLXSSInyección de comandosPrevenciónConsultas con parámetrostextContent, no innerHTMLNo pasar texto a la terminal
Cómo evitar las inyecciones más comunes.

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.txt o package-lock.json y actualiza cuando salgan parches de seguridad. npm audit y pip-audit revisan 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.Sí: Valida todo en el servidor. Sí: Contraseñas con bcrypt, scrypt o Argon2. Sí: Dependencias oficiales y actualizadas. No: Claves en el repositorio o modo depuración en producciónLISTA RÁPIDAPrograma seguroValida todo en el servidorContraseñas con bcrypt, scrypt o Argon2Dependencias oficiales y actualizadasClaves en el repositorio o modo depuración en producción
Hábitos que evitan la mayoría de problemas.

Hábitos que evitan la mayoría de problemas

  1. Valida en el servidor todo lo que llega: tipo, longitud y formato. La validación del navegador es comodidad para el usuario, no seguridad.
  2. Mínimo privilegio: cada usuario, proceso y base de datos con los permisos justos.
  3. Usa lo que ya existe: autenticación, cifrado y sesiones de tu framework, no inventes tu propio sistema.
  4. Gestiona los errores: que un fallo inesperado deje la operación cancelada, no a medias, y que se registre para poder investigarlo.
  5. 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.