Skip to Content

Go (net/http)

Go est conçu pour des services réseau ultra-rapides. Étant donné que ProxyTracer répond en moins de 10 ms, l'appeler dans un gestionnaire d'intergiciel standard net/http ne créera aucun goulot d'étranglement perceptible dans vos goroutines.

L'Intergiciel

Cette implémentation extrait en toute sécurité l'IP des en-têtes X-Forwarded-For, utilise le http.Client natif de Go avec un délai d'attente strict, et bloque les connexions malveillantes immédiatement avant qu'elles n'atteignent votre lourde logique applicative.

package middleware import ( "encoding/json" "log" "net/http" "os" "strings" "time" ) // ProxyTracerResponse correspond exactement à la réponse JSON {"proxy": true|false} type ProxyTracerResponse struct { Proxy bool `json:"proxy"` } func ProxyTracer(next http.Handler) http.Handler { apiKey := os.Getenv("PROXYTRACER_API_KEY") // Initialiser un client réutilisable avec un timeout strict de 500 ms client := &http.Client{ Timeout: 500 * time.Millisecond, } return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // 1. Extraire en toute sécurité l'IP réelle derrière les équilibreurs de charge ip := r.Header.Get("X-Forwarded-For") if ip == "" { ip = strings.Split(r.RemoteAddr, ":")[0] } else { ip = strings.Split(ip, ",")[0] } ip = strings.TrimSpace(ip) // Laisser passer en cas de développement local if ip == "127.0.0.1" || ip == "::1" || ip == "" { next.ServeHTTP(w, r) return } // 2. Interroger l'API ProxyTracer req, err := http.NewRequest("GET", "https://api.proxytracer.com/v1/check/"+ip, nil) if err == nil { req.Header.Set("Authorization", "Bearer "+apiKey) resp, err := client.Do(req) if err == nil && resp.StatusCode == http.StatusOK { defer resp.Body.Close() var ptResp ProxyTracerResponse if err := json.NewDecoder(resp.Body).Decode(&ptResp); err == nil { // 3. Interrompre la connexion si un proxy/VPN est détecté if ptResp.Proxy { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusForbidden) w.Write([]byte(`{"error": "Access Denied: VPN or Proxy detected."}`)) return // Court-circuite la chaîne des gestionnaires } } } else { // Fail open : journaliser l'erreur et laisser passer la requête pour garantir la disponibilité log.Printf("ProxyTracer API error: %v", err) } } // 4. Le trafic est sain, poursuivre vers le gestionnaire suivant next.ServeHTTP(w, r) }) }

Utilisation

Enveloppez simplement votre routeur principal ou des points de terminaison sensibles spécifiques avec l'intergiciel:

func main() { mux := http.NewServeMux() mux.HandleFunc("/api/secure-data", secureHandler) // Englober l'ensemble du multiplexeur dans le middleware ProxyTracer log.Fatal(http.ListenAndServe(":8080", middleware.ProxyTracer(mux))) }
Dernière mise à jour le