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.py 的 MIDDLEWARE 列表中注册该中间件。建议将其放置在中间件堆栈的前列(紧随 SecurityMiddleware 和 SessionMiddleware 之后),以便尽早拦截恶意流量。
# settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
# ...
'your_app.middleware.ProxyTracerMiddleware',
# ...
]最后更新于