Seguridad en aplicaciones web: Guía esencial para desarrolladores
SeguridadCiberseguridadBackendWebBest Practices

Seguridad en aplicaciones web: Guía esencial para desarrolladores

6 min de lectura30 de marzo de 2026

La mayoría de vulnerabilidades nacen en el desarrollo. Input no confiable, SQL injection, auth vs autorización, contraseñas, HTTPS, CSRF, XSS, rate limiting, JWT y mínimos privilegios — qué aplicar desde el código.

La seguridad en aplicaciones web no es solo responsabilidad del equipo de sistemas o de ciberseguridad. La mayoría de las vulnerabilidades nacen durante el desarrollo, no durante el despliegue.


Como desarrolladores full stack, hay ciertos principios de seguridad que deberíamos aplicar siempre. No hace falta ser un experto en hacking para evitar la mayoría de ataques, pero sí entender dónde están los riesgos y cómo mitigarlos.


En este artículo resumo los puntos más importantes que cualquier desarrollador debería conocer.


1. Nunca confíes en el input del usuario


Regla número uno de seguridad: todo lo que venga del usuario es potencialmente malicioso.


Esto incluye:


  • Formularios
  • Parámetros en la URL
  • Headers
  • Cookies
  • Archivos subidos
  • JSON de una API

  • Siempre hay que validar:


  • Tipo de dato
  • Longitud
  • Formato
  • Valores permitidos

  • Ejemplo en FastAPI:


    from pydantic import BaseModel
    
    class UserRequest(BaseModel):
        email: str
        age: int
    

    Esto evita que alguien envíe datos inesperados o estructuras que rompan tu sistema.


    2. SQL Injection: sigue siendo uno de los ataques más comunes


    Ocurre cuando construyes queries SQL concatenando strings.


    Incorrecto:


    query = "SELECT * FROM users WHERE email = '" + email + "'"
    

    Correcto:


    cursor.execute("SELECT * FROM users WHERE email = %s", (email,))
    

    O usando ORM:


  • Django ORM
  • SQLAlchemy

  • Nunca construyas SQL concatenando strings.


    3. Autenticación vs Autorización


    Muchos sistemas implementan login, pero olvidan la autorización.


  • **Autenticación:** quién eres
  • **Autorización:** qué puedes hacer

  • Ejemplo:


  • Un usuario puede estar autenticado
  • Pero no debería poder acceder a `/admin`
  • Ni a datos de otros usuarios

  • Esto debe comprobarse en el backend siempre, no solo en el frontend.


    4. Contraseñas: nunca se guardan en texto plano


    Nunca. Bajo ningún concepto.


    Se deben guardar usando hash seguro:


  • bcrypt
  • argon2

  • Ejemplo:


    import bcrypt
    
    hashed = bcrypt.hashpw(password.encode(), bcrypt.gensalt())
    

    Y para verificar:


    bcrypt.checkpw(password.encode(), hashed)
    

    5. Uso de HTTPS


    Parece obvio, pero sin HTTPS:


  • Las contraseñas viajan en texto plano
  • Los tokens pueden ser interceptados
  • Las cookies pueden ser robadas

  • Siempre:


  • HTTPS
  • Cookies con HttpOnly
  • Cookies con Secure
  • Cookies con SameSite

  • 6. Protección contra ataques comunes


    CSRF


    Ataques donde un usuario autenticado ejecuta acciones sin saberlo.


    Solución:


  • CSRF tokens
  • SameSite cookies

  • XSS


    Inyección de JavaScript en la web.


    Solución:


  • Escapar HTML
  • No usar `dangerouslySetInnerHTML`
  • Sanitizar contenido

  • Rate limiting


    Para evitar:


  • Fuerza bruta
  • Ataques a login
  • Spam a APIs

  • Ejemplo:


  • Limitar login a 5 intentos por minuto
  • Limitar API por IP

  • 7. Tokens y autenticación moderna


    Hoy en día lo más común es usar:


  • JWT
  • OAuth2
  • OpenID Connect

  • Pero hay que usarlos bien:


  • Tokens con expiración corta
  • Refresh tokens
  • No guardar JWT en `localStorage` (mejor cookies HttpOnly)
  • Rotación de tokens

  • 8. Logs y monitorización


    La seguridad no es solo prevenir, también es detectar.


    Debes loggear:


  • Intentos de login
  • Errores de autenticación
  • Cambios de contraseña
  • Accesos a admin
  • Errores 500
  • Demasiadas peticiones

  • Si no tienes logs, no sabes si te están atacando.


    9. Principio de mínimos privilegios


    Cada parte del sistema debe tener solo los permisos necesarios.


    Ejemplos:


  • La API no debería conectarse a la DB como root
  • El usuario de la DB solo debería poder acceder a su base de datos
  • Un usuario normal no debería poder ejecutar acciones de admin

  • Si algo se compromete, el daño será mucho menor.


    10. La seguridad no es un feature, es una base


    Un error muy común es pensar: “Primero desarrollamos y luego añadimos seguridad.”


    Esto es un error.


    La seguridad debe estar en:


  • La arquitectura
  • La base de datos
  • La autenticación
  • Las APIs
  • El frontend
  • El despliegue

  • Porque arreglar un problema de seguridad al final es mucho más caro que hacerlo bien desde el principio.


    Checklist básica de seguridad para aplicaciones web


    Antes de subir a producción, revisa:


  • Validación de inputs
  • Queries parametrizadas
  • Contraseñas hasheadas
  • HTTPS
  • Tokens con expiración
  • Rate limiting
  • Logs
  • Permisos de usuario
  • Variables de entorno seguras
  • No exponer claves en el código
  • Backups de base de datos

  • Conclusión


    La mayoría de ataques web no son ataques sofisticados. Son ataques a aplicaciones con errores básicos de seguridad.


    No hace falta ser experto en ciberseguridad para evitar el 80% de problemas, pero sí aplicar buenas prácticas desde el desarrollo.


    La seguridad no consiste en hacer un sistema imposible de atacar, sino en no ser el sistema más fácil de atacar.


    Compartir artículo
    María Gargoles

    María Gargoles

    Full Stack Developer & SysAdmin