Skip to Content

Django (Python)

Django 애플리케이션의 경우 IP 유효성 검사를 시행하는 가장 안전한 방법은 사용자 정의 미들웨어 클래스를 생성하는 것입니다. 이렇게 하면 악성 트래픽이 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' 파일에 미들웨어를 등록하세요. 불량 트래픽을 조기에 삭제하려면 스택의 높은 위치(보안 및 세션 미들웨어 바로 뒤)에 배치하세요.

# settings.py MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', # ... 'your_app.middleware.ProxyTracerMiddleware', # ... ]
최종 수정일: