Django (Python)
Para aplicaciones Django, la forma más segura de imponer la validación de IP es creando una clase de middleware personalizada. Esto asegura que el tráfico malicioso sea rechazado antes de que llegue a tus vistas de Django o consuma conexiones a la base de datos.
El Middleware
Este middleware determina con seguridad la IP real del cliente, utiliza la biblioteca estándar requests para consultar ProxyTracer y devuelve una respuesta en bruto HttpResponseForbidden para detener el ciclo de vida de la solicitud inmediatamente.
import os
import requests
from django.http import HttpResponseForbidden
class ProxyTracerMiddleware:
def __init__(self, get_response):
self.get_response = get_response
self.api_key = os.environ.get("PROXYTRACER_API_KEY")
def get_client_ip(self, request):
# 1. Extraer de forma segura la IP real detrás de balanceadores de carga/NGINX
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[0].strip()
else:
ip = request.META.get('REMOTE_ADDR')
return ip
def __call__(self, request):
ip = self.get_client_ip(request)
# Omitir las IPs de desarrollo local
if ip and ip not in ['127.0.0.1', '::1']:
try:
# 2. Consultar la API de ProxyTracer con un timeout estricto
response = requests.get(
f"https://api.proxytracer.com/v1/check/{ip}",
headers={"Authorization": f"Bearer {self.api_key}"},
timeout=0.5 # Tiempo de espera estricto de 500ms para evitar cuellos de botella
)
if response.status_code == 200:
data = response.json()
# 3. Descartar la conexión si se detecta un proxy/VPN
if data.get("proxy") is True:
return HttpResponseForbidden(
'{"error": "Access Denied: VPN or Proxy detected."}',
content_type="application/json"
)
except requests.RequestException as e:
# Fail open: Registrar el error y permitir el paso de la solicitud
print(f"ProxyTracer validation failed: {e}")
# 4. El tráfico está limpio, continuar hacia la vista
response = self.get_response(request)
return responseConfiguración:
Para activar la protección, registra el middleware en tu archivo settings.py. Colócalo en una posición alta dentro de la pila (justo después de los middlewares de seguridad y sesión) para descartar el tráfico malicioso a tiempo.
# settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
# ...
'your_app.middleware.ProxyTracerMiddleware',
# ...
]Última actualización el