Skip to Content

Django(Python)

Django はビューにルーティングする前に一連のミドルウェアクラスを通じて受信リクエストを処理します。ProxyTracer をカスタム Django ミドルウェアとして統合することで、データベースクエリやビジネスロジックが実行される前にリクエストをグローバルにインターセプトし、不審な接続を破棄できます。

ミドルウェアの実装

このミドルウェアは request.META からクライアント IP アドレスを抽出し、高速な HTTP クライアントを使用して ProxyTracer API をクエリして、IP がプロキシとして識別された場合に 403 Forbidden ステータスの JsonResponse を即座に返します。

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: # フェイルオープン: エラーをログに記録し、リクエストの通過を許可 print(f"ProxyTracer validation failed: {e}") # 4. トラフィックは正常です。ビューへ処理を渡します response = self.get_response(request) return response

設定:

設定手順: settings.pyMIDDLEWARE リストに proxytracer_middleware.ProxyTracerMiddleware を追加します。PROXYTRACER_API_KEY が環境変数から読み込まれていることを確認してください。

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