FastAPI (Python)
FastAPI ist für leistungsstarke, asynchrone Webanwendungen konzipiert. Um diese Geschwindigkeit aufrechtzuerhalten, integrieren wir ProxyTracer mithilfe einer benutzerdefiniertenBaseHTTPMiddleware 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