Regístrate para acceder a más de 15 cursos gratuitos de programación con un simulador

Seguridad Python: Desarrollo web con Flask

En este punto del curso ya sabes cómo hacer funcionar un sitio web básico con Flask. ¡Bien hecho! Pero antes de seguir construyendo nuevas funciones increíbles, es muy importante detenernos un momento y hablar de algo clave: la seguridad. 🔒


¿Por qué es importante la seguridad web?

Muchos sitios, incluso los de grandes empresas, tienen fallos de seguridad. Esto se puede traducir en:

📉 Pérdida o robo de datos de usuarios.

🛑 Daños a la reputación del sitio (y del negocio).

❌ Bloqueo o eliminación del sitio completo.

Por eso, así como no dejas la puerta de tu casa abierta, tampoco quieres que tu sitio esté vulnerable.


Primer regla de seguridad: nunca confíes en el usuario

Lo primero —y más importante— que tienes que entender es esto:

Nunca confíes en los datos que vienen de los usuarios.

Aunque la mayoría de usuarios no quiera hacer daño, un atacante sí puede enviar datos con malas intenciones. Veamos un ejemplo para entenderlo mejor.


Ejemplo: ruta con nombre de usuario

Imagina que tu aplicación tiene esta ruta:
http://localhost:8000/users/nick
Y tú simplemente tomas ese valor (nick) y lo muestras en un título H1:

<h1>{{ name }}</h1>

Ahora piensa qué pasa si alguien usa un URL como este:

http://localhost:8000/users/%3Cscript%3Ealert('attack!')%3B%3C%2Fscript%3E

Después de descodificar, eso es lo mismo que escribir:

<h1><script>alert('attack!');</script></h1>

En este caso, ¡el navegador ejecuta el código JavaScript! Y ahí es donde empieza el problema.

XSS example


¿Qué es una XSS?

Ese ataque se llama XSS (Cross-Site Scripting), que en español significa secuencia de comandos en sitios cruzados

¿Cómo funciona?

1️⃣ Inyección de código

El atacante logra insertar código JavaScript dentro de una página vulnerable.

2️⃣ Ejecución en el navegador

Cuando un usuario visita la página, el código inyectado se ejecuta como si fuera parte del sitio legítimo.

3️⃣ Robo de información

El atacante puede acceder a cookies 🍪, tokens 🔑 o datos personales 📋 del usuario, comprometiendo su seguridad.

💡 Este tipo de vulnerabilidad es muy común y peligrosa, incluso en plataformas grandes como Facebook.

¿Cómo prevenir XSS en Flask?

Flask utiliza un motor de plantillas llamado Jinja2. Y la buena noticia es: Jinja2 ya realiza auto-escape automático. Eso significa que convierte los caracteres peligrosos (como < y >) en versiones seguras que el navegador no interpreta como código HTML. ✅

Veamos un ejemplo:

import html

text = "A 'quote' is <b>bold</b>"
print(html.escape(text))
# Salida: A 'quote' is &lt;b&gt;bold&lt;/b&gt;

Esto evita que los tags HTML se ejecuten accidentalmente.

Ahora, en Jinja2 con Flask:

<h1>{{ name }}</h1>

Por defecto, name se escapa para que no se pueda ejecutar código malicioso.

Escape efectivo


Casos donde el escape automático no es suficiente

Aunque Jinja2 ayuda mucho, hay situaciones donde tienes que tener más cuidado:

Atributos sin comillas

Puede parecer inofensivo, pero si haces esto:

<input value={{ user_input }}>

Y si alguien entra esto como valor:

onfocus=alert('attack!')

El HTML resultante sería ejecutable.

Solución: siempre pon comillas:

<input value="{{ user_input }}">
Enlaces que ejecutan JavaScript

Este código:

<a href="{{ url }}">Haz clic aquí</a>

Podría convertirse fácilmente en algo como:

<a href="javascript:alert('attack!')">Haz clic aquí</a>

Solución: en este caso, además de escapar, debes usar políticas de seguridad adicionales como CSP.


¿Qué es CSP?

CSP (Content Security Policy) es una cabecera HTTP que le dice al navegador “solo puedes ejecutar scripts de estas fuentes específicas”. Es un escudo extra contra XSS. 🛡️

Puedes aprender a usarlo con Flask en la documentación oficial de Flask sobre CSP.


¿Y qué hay de otras amenazas?

Además de XSS, existen otros ataques muy comunes como:

  • SQL Injection - Inyección de código en consultas de bases de datos
  • CSRF (Cross-Site Request Forgery) - Engaña al usuario para ejecutar acciones no autorizadas.
  • Clickjacking - Oculta enlaces maliciosos en elementos visibles de una web

Para poder entender y defenderte de estos, primero tendrás que aprender cómo se conectan las aplicaciones a bases de datos. Pero por ahora, haber entendido XSS ya es un gran paso adelante.


Resumen

  • La seguridad es clave, incluso en proyectos pequeños.
  • El ataque XSS ocurre cuando se ejecuta JS malicioso dentro de la página.
  • Jinja2 proporciona protección automática escapando caracteres peligrosos.
  • Tienes que tener cuidado especial en atributos HTML y enlaces para evitar nuevas formas de XSS.
  • Las cabeceras CSP fortalecen la seguridad de tu sitio.
  • Esta es solo una parte de la seguridad web, más adelante aprenderás sobre SQL Injection y otros ataques.

Recuerda, no necesitas aprender todo de seguridad de una sola vez, pero es fundamental que empieces con buenas prácticas desde ya. Y lo estás haciendo. ¡Sigue así!

Para acceder completo a curso necesitas un plan básico

El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.

Obtener acceso
130
cursos
1000
ejercicios
2000+
horas de teoría
3200
test

Obtén acceso

Cursos de programación para principiantes y desarrolladores experimentados. Comienza tu aprendizaje de forma gratuita

  • 130 cursos, 2000+ horas de teoría
  • 1000 ejercicios prácticos en el navegador
  • 360 000 estudiantes
Al enviar el formulario, aceptas el «Política de privacidad» y los términos de la «Oferta», y también aceptas los «Términos y condiciones de uso»

Nuestros graduados trabajan en empresas como:

Bookmate
Health Samurai
Dualboot
ABBYY