CAPÍTULO 9 · El mismo proyecto llega a Azure
Django tiene que entender lo que ocurrió delante de él
El navegador puede establecer una conexión HTTPS con la plataforma mientras el proceso Django recibe una comunicación interna bajo otras condiciones. Si la aplicación interpreta únicamente ese último tramo, puede tomar decisiones equivocadas sobre redirecciones o cookies. La seguridad necesita una relación clara entre el proxy y el código.
Examinamos qué información transmite el proxy y cuándo podemos confiar en ella. Los hosts y orígenes permitidos siguen siendo explícitos, y la cabecera que indica el protocolo no debe convertirse en una afirmación controlada libremente por el cliente. El contrato de infraestructura completa lo que una opción en settings puede expresar.
Con el recorrido comprendido ya podemos leer production.py con más criterio. Cada ajuste deja de ser una línea aislada: responde a cómo llegan las solicitudes y cómo deben salir las respuestas. La siguiente lección reúne esos valores y explica las condiciones necesarias para que las protecciones actúen como esperamos.
Leer esta parte dentro del relato completo →DEL RELATO A LA PRÁCTICA
Vamos a desarrollar esta decisión con su mapa, explicación, código y ejercicio.
MIRA · CONECTA · COMPRENDE
Controles entre navegador y aplicación
Las flechas resumen el recorrido conceptual. Los controles y dependencias se detallan debajo.
Selecciona una pieza para destacar su responsabilidad.
Leer la explicación del mapa
- Cliente. Usa HTTPS
- Proxy confiable. Controla cabeceras de transporte
- Settings. Hosts, secretos y seguridad
- Verificación. Prueba configuración efectiva
01 / EL PROBLEMA
¿Para qué sirve?
Configuraciones copiadas sin conocer el proxy pueden provocar bucles HTTPS o confiar en cabeceras fabricadas. La seguridad exige verificar el entorno real.
02 / COMPRENDER
El concepto, explicado
DEBUG=False, SECRET_KEY fuera del código y ALLOWED_HOSTS explícito son controles de base. Una variable de entorno mejora separación, pero necesita protección del almacén, acceso y rotación.
SECURE_PROXY_SSL_HEADER solo es seguro si el proxy confiable elimina o controla la cabecera que recibe del cliente. Verifica ese contrato antes de usarlo.
HSTS compromete al navegador a usar HTTPS. Empieza con una duración corta mientras validas; includeSubDomains exige que todos funcionen por HTTPS. Preload requiere cumplir y solicitar requisitos del programa, no solo activar un booleano.
Cookies Secure, HttpOnly y SameSite tienen funciones diferentes. HttpOnly no impide todo XSS; CSRF, CSP y control de contenido se complementan. Las opciones de sesión se enseñan para apps que las usan; esta academia no añade login.
SECURE_PROXY_SSL_HEADER solo es seguro cuando el proxy confiable elimina o sobrescribe el header y no existe acceso directo no controlado. SESSION_COOKIE_SECURE y CSRF_COOKIE_SECURE requieren HTTPS; no se copian sin más al desarrollo HTTP.
No existe un middleware que resuelva toda la ciberseguridad. Combina escape de templates, validación de entrada, CSRF, autorización de API, límites, secretos, dependencia revisada, logs sin credenciales y pruebas. X_FRAME_OPTIONS=DENY bloquea incluso iframes propios: usa excepción SAMEORIGIN únicamente donde esté justificada.
Continúa con “Seguridad en production.py” para aplicar y comprobar HTTPS, confianza del proxy, cookies Secure y HSTS.
La lección siguiente muestra la política exacta de production.py y desglosa sus ajustes uno por uno. Esa política usa HSTS de un año con subdominios y preload; requiere HTTPS correcto en todo el alcance y una frontera de proxy confiable.
Control, alcance y comprobación
| Control | Qué aporta | Qué comprobar |
|---|---|---|
| DEBUG=False | Reduce exposición de información interna | Una excepción no publica el traceback |
| Sesión HttpOnly y Secure | Limita acceso JS y envío por HTTP | Cookies y flujo real bajo HTTPS |
| CSRF y SameSite | Reduce solicitudes cruzadas no autorizadas | POST con y sin token |
| Autorización en backend | Controla operaciones y recursos | Usuario sin capacidad recibe denegación |
| Escape de templates | Reduce inyección de markup no confiable | No marcar entradas como safe |
| Cabeceras de proxy | Permite reconocer HTTPS tras proxy confiable | No aceptar cabeceras suplantadas |
| HSTS gradual | Recuerda la exigencia de HTTPS | Todo el alcance funciona antes de ampliar |
| SCA y revisión de secretos | Detecta dependencias y exposición conocidas | Triaje, actualización y cierre verificable |
03 / CONSTRUIR
Implementación paso a paso
- Ejecuta check --deploy sobre settings productivos y revisa configuración heredada.
- Verifica TLS externo y cómo Django detecta request.is_secure detrás del proxy.
- Valida hosts, secretos, logging sin datos sensibles y almacenamiento persistente.
- Prueba redirecciones y cabeceras, después aumenta HSTS de forma gradual.
- En una app con sesiones configura cookies y verifica CSRF en escrituras.
- Añade CSP según scripts/estilos reales y supervisa reportes antes de endurecer.
04 / APLICAR
Ejemplo en SensorHub
# Fragmento para completar en settings productivos.
import os
DEBUG = False
SECRET_KEY = os.environ["SECRET_KEY"]
ALLOWED_HOSTS = os.environ["ALLOWED_HOSTS"].split(",")
SECURE_SSL_REDIRECT = True
SECURE_HSTS_SECONDS = 31536000
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
SECURE_CONTENT_TYPE_NOSNIFF = True
SECURE_REFERRER_POLICY = "same-origin"
X_FRAME_OPTIONS = "DENY"
# SOLO con un proxy que controla la cabecera entrante:
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_SAMESITE = "Lax"
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
CSRF_COOKIE_SAMESITE = "Lax"
CSRF_TRUSTED_ORIGINS = ["https://sensorhub.example"]
# Si activas CSRF_COOKIE_HTTPONLY, toma el token del DOM renderizado.
# El timeout de sesión se decide según el riesgo y tipo de aplicación.Cómo leer el ejemplo
- La falta de SECRET_KEY falla al inicio, no genera una clave productiva por defecto.
- El fragmento no equivale a una revisión completa de seguridad.
- No se activa preload ni subdominios sin evaluar consecuencias.
Error habitual
Usar HSTS de un año con todos los subdominios desde el primer ensayo o confiar en X-Forwarded-Proto sin límite de confianza.
05 / PRACTICAR
Tu turno
Tras activar redirección HTTPS detrás del proxy aparece un bucle. Diseña el diagnóstico.
Ver solución orientativa
Comprueba esquema externo y request.is_secure. Verifica cabecera emitida y sanitizada por el proxy; ajusta configuración de confianza solo cuando ese contrato esté probado.
06 / VERIFICAR
Cómo sabes que funciona
- check --deploy se ejecuta con settings correctos.
- No hay bucles ni hosts comodín injustificados.
- Secretos y cookies no se filtran en logs.
Para profundizar
Documentación oficial para comprobar configuración, permisos y condiciones vigentes. Revisión del tema: 2026-10-11.
CONTINUAR LA EXPERIENCIA
El siguiente paso del recorrido:
Seguridad en production.py: HTTPS, proxy y HSTS →Continuar en modo relato