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.py の MIDDLEWARE リストに proxytracer_middleware.ProxyTracerMiddleware を追加します。PROXYTRACER_API_KEY が環境変数から読み込まれていることを確認してください。
# settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
# ...
'your_app.middleware.ProxyTracerMiddleware',
# ...
]最終更新日: