Skip to Content

FastAPI (Python)

FastAPI ist für leistungsstarke, asynchrone Webanwendungen konzipiert. Um diese Geschwindigkeit aufrechtzuerhalten, integrieren wir ProxyTracer mithilfe einer benutzerdefinierten BaseHTTPMiddleware und eines asynchronen HTTP-Clients (httpx), um sicherzustellen, dass die Event-Schleife (Event-Loop) nie blockiert wird.

Die Middleware

Diese Implementierung extrahiert die echte Client-IP sicher, verwendet einen asynchronen Verbindungs-Pool, um ProxyTracer abzufragen, und gibt strikt einen 403 Forbidden zurück, wenn das Flag proxy true liefert.

import os import httpx from fastapi import FastAPI, Request, status from fastapi.responses import JSONResponse from starlette.middleware.base import BaseHTTPMiddleware app = FastAPI() class ProxyTracerMiddleware(BaseHTTPMiddleware): def __init__(self, app): super().__init__(app) self.api_key = os.getenv("PROXYTRACER_API_KEY") # Persistenten asynchronen Client für Connection-Pooling und maximale Geschwindigkeit initialisieren self.client = httpx.AsyncClient(timeout=0.5) # Striktes 500ms-Timeout async def dispatch(self, request: Request, call_next): # 1. Echte IP hinter Load-Balancern/Proxys sicher extrahieren forwarded_for = request.headers.get("x-forwarded-for") if forwarded_for: ip = forwarded_for.split(",")[0].strip() else: ip = request.client.host if request.client else None # Lokale Entwicklungs-IPs überspringen if ip and ip not in ["127.0.0.1", "::1", "testclient"]: try: # 2. ProxyTracer-API asynchron abfragen response = await self.client.get( f"https://api.proxytracer.com/v1/check/{ip}", headers={"Authorization": f"Bearer {self.api_key}"} ) if response.status_code == 200: data = response.json() # 3. Verbindung sofort trennen, falls ein Proxy erkannt wird if data.get("proxy") is True: return JSONResponse( status_code=status.HTTP_403_FORBIDDEN, content={"error": "Access Denied: VPN or Proxy detected."} ) except httpx.RequestError as e: # Fail-Open: Netzwerkfehler protokollieren und Anfrage fortsetzen lassen print(f"ProxyTracer API timeout or failure: {e}") # 4. Traffic ist sauber, weiter zum Route-Handler return await call_next(request) # Middleware global anwenden app.add_middleware(ProxyTracerMiddleware)

Hinweis zur Abhängigkeit: Diese Implementierung erfordert die httpx-Bibliothek für asynchrone HTTP-Anfragen. Installieren Sie diese über pip install httpx.

Zuletzt aktualisiert am