Seguridad en aplicaciones web: Guía esencial para desarrolladores
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:
Siempre hay que validar:
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:
Nunca construyas SQL concatenando strings.
3. Autenticación vs Autorización
Muchos sistemas implementan login, pero olvidan la autorización.
Ejemplo:
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:
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:
Siempre:
6. Protección contra ataques comunes
CSRF
Ataques donde un usuario autenticado ejecuta acciones sin saberlo.
Solución:
XSS
Inyección de JavaScript en la web.
Solución:
Rate limiting
Para evitar:
Ejemplo:
7. Tokens y autenticación moderna
Hoy en día lo más común es usar:
Pero hay que usarlos bien:
8. Logs y monitorización
La seguridad no es solo prevenir, también es detectar.
Debes loggear:
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:
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:
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:
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.

María Gargoles
Full Stack Developer & SysAdmin