chore: build
ci-api / test (push) Successful in 25m3s
ci-web / test (push) Successful in 15m11s

This commit is contained in:
Xor290
2026-08-24 18:46:44 +02:00
parent 8df0841686
commit cb48bb2b70
8 changed files with 116 additions and 97 deletions
@@ -34,6 +34,29 @@ func New(d Deps) *gin.Engine {
gin.SetMode(gin.ReleaseMode)
}
r := gin.New()
// Sans ça, Gin fait confiance par défaut au X-Forwarded-For fourni par
// N'IMPORTE QUEL client pour déterminer c.ClientIP() (utilisé par
// RateLimit) — un attaquant peut alors faire croire que chaque requête
// vient d'une IP différente en changeant juste cet en-tête, contournant
// intégralement la limitation de débit sur /auth/login et
// /auth/register (trouvé en pentest, voir F-005).
//
// L'API n'est jamais exposée directement (pas de "ports:" dans
// docker-compose.yml, voir docker/docker-compose.yml) — seul nginx/waf,
// sur le réseau Docker interne, peut l'atteindre (proxy_pass vers
// http://api:8080, voir docker/waf/nginx.conf qui construit le
// X-Forwarded-For via $proxy_add_x_forwarded_for : ajoute toujours la
// vraie IP vue par nginx en dernière position, sans jamais écraser une
// valeur fournie par le client). En ne faisant confiance qu'aux plages
// privées RFC1918 (réseau Docker interne), Gin ignore la partie du
// X-Forwarded-For contrôlée par le client et ne retient que la partie
// ajoutée par nginx.
if err := r.SetTrustedProxies([]string{"10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"}); err != nil {
// CIDR statiques et valides : ne peut arriver qu'en cas d'erreur de
// programmation (typo) — fatal au démarrage plutôt que de tourner
// avec la protection anti-spoofing désactivée sans s'en rendre compte.
panic(err)
}
r.Use(gin.Recovery())
r.Use(httpx.SecurityHeaders())
r.Use(httpx.CORS(d.Cfg.AllowedOrigins))