From 2764228abf1c36b040c78c6c11c6a6b43b6572f1 Mon Sep 17 00:00:00 2001 From: "IETM_FIXE\\ietm6" Date: Fri, 24 Apr 2026 08:55:40 +0200 Subject: [PATCH] Fix rate limit derriere Cloudflare + CORS sur POST demo --- demo/orchestrator/ratelimit.go | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/demo/orchestrator/ratelimit.go b/demo/orchestrator/ratelimit.go index a81c1cd..2e4d03a 100644 --- a/demo/orchestrator/ratelimit.go +++ b/demo/orchestrator/ratelimit.go @@ -56,11 +56,18 @@ func (rl *rateLimiter) cleanupLoop() { } } -// clientIP extrait l'IP reelle en prenant la derniere entree de X-Forwarded-For. -// Justification : Traefik APPEND l'IP du peer au header existant, donc la -// derniere valeur est celle que Traefik a observe directement (le vrai client). -// Prendre la premiere serait une faille : un attaquant peut preremplir le header. +// clientIP extrait l'IP reelle du visiteur en tenant compte du setup reverse-proxy. +// Ordre de priorite : +// 1. CF-Connecting-IP : defini par Cloudflare sur la base de SA propre vue du +// peer TCP, non-forgeable par le client, ecrase toute valeur entrante. +// 2. X-Forwarded-For, derniere entree : quand seul Traefik est en front (pas +// de Cloudflare), Traefik append l'IP qu'il observe. Prendre la premiere +// serait une faille (header forgeable). +// 3. RemoteAddr : fallback si aucun header de proxy n'est present. func clientIP(r *http.Request) string { + if cfIP := r.Header.Get("CF-Connecting-IP"); cfIP != "" { + return strings.TrimSpace(cfIP) + } if xff := r.Header.Get("X-Forwarded-For"); xff != "" { parts := strings.Split(xff, ",") return strings.TrimSpace(parts[len(parts)-1])