FastAPI (Python)
FastAPI è progettato per applicazioni web asincrone ad alte prestazioni. Per mantenere tale velocità, integriamo ProxyTracer utilizzando unBaseHTTPMiddleware personalizzato e un client HTTP asincrono (httpx) per garantire che l'event loop non venga mai bloccato.
Il Middleware
Questa implementazione estrae in sicurezza l'IP reale del client, utilizza un pool di connessioni asincrone per interrogare ProxyTracer e restituisce un rigoroso 403 Forbidden se il flag proxy restituisce true.
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")
# Inizializza un client asincrono persistente per il connection pooling e la massima velocità
self.client = httpx.AsyncClient(timeout=0.5) # Timeout rigoroso di 500ms
async def dispatch(self, request: Request, call_next):
# 1. Estrai in modo sicuro l'IP reale dietro i load balancer/proxy
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
# Salta gli IP di sviluppo locale
if ip and ip not in ["127.0.0.1", "::1", "testclient"]:
try:
# 2. Interroga l'API ProxyTracer in modo asincrono
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. Interrompi immediatamente la connessione se viene rilevato un proxy
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: registra l'errore di rete e consenti alla richiesta di procedere
print(f"ProxyTracer API timeout or failure: {e}")
# 4. Il traffico è pulito, procedi all'handler della route
return await call_next(request)
# Applica il middleware a livello globale
app.add_middleware(ProxyTracerMiddleware)Nota sulle Dipendenze: Questa implementazione richiede la libreria httpx per le richieste HTTP asincrone. Installala tramite pip install httpx.
Ultimo aggiornamento il