Skip to Content

Django (Python)

在 Django 中,最理想的防护方案是实现自定义 HTTP 中间件。该中间件在 Django 视图处理请求前执行,从而为整个应用程序提供轻量级且高可用的安全屏障。

中间件实现

此中间件安全解析客户端的真实 IP,使用标准 requests 库查询 ProxyTracer,并在检测到代理时返回原生的 HttpResponseForbidden 以立即终止请求生命周期。

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. 安全提取负载均衡器/NGINX 背后的真实 IP 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) # 跳过本地开发环境 IP if ip and ip not in ['127.0.0.1', '::1']: try: # 2. 查询 ProxyTracer API(配置严格超时) response = requests.get( f"https://api.proxytracer.com/v1/check/{ip}", headers={"Authorization": f"Bearer {self.api_key}"}, timeout=0.5 # 严格的 500ms 超时限制以防止性能瓶颈 ) if response.status_code == 200: data = response.json() # 3. 若检测到代理/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):记录错误并放行请求 print(f"ProxyTracer validation failed: {e}") # 4. 流量正常,继续传递至视图 response = self.get_response(request) return response

配置说明:

要激活安全防护,请在 settings.pyMIDDLEWARE 列表中注册该中间件。建议将其放置在中间件堆栈的前列(紧随 SecurityMiddleware 和 SessionMiddleware 之后),以便尽早拦截恶意流量。

# settings.py MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', # ... 'your_app.middleware.ProxyTracerMiddleware', # ... ]
最后更新于