package middleware import ( "github.com/gin-gonic/gin" ) // SecurityHeaders ajoute des headers de sécurité HTTP recommandés // MOD-P2-005: Headers sécurité manquants (HSTS, CSP, X-Frame-Options, etc.) func SecurityHeaders() gin.HandlerFunc { return func(c *gin.Context) { // Strict-Transport-Security (HSTS) - Force HTTPS // Max-Age: 31536000 = 1 an // IncludeSubDomains: inclut tous les sous-domaines // Preload: permet d'être inclus dans les listes de préchargement HSTS des navigateurs c.Header("Strict-Transport-Security", "max-age=31536000; includeSubDomains; preload") // X-Content-Type-Options - Empêche le MIME type sniffing // Force le navigateur à respecter le Content-Type déclaré c.Header("X-Content-Type-Options", "nosniff") // X-Frame-Options - Empêche le clickjacking // DENY: empêche le site d'être affiché dans une frame (iframe, embed, object) c.Header("X-Frame-Options", "DENY") // X-XSS-Protection - Protection XSS (déprécié mais encore supporté par certains navigateurs) // mode=block: bloque la page si une attaque XSS est détectée c.Header("X-XSS-Protection", "1; mode=block") // Referrer-Policy - Contrôle les informations de referrer envoyées // strict-origin-when-cross-origin: envoie l'origine complète pour les requêtes same-origin, // seulement l'origine pour les requêtes cross-origin HTTPS->HTTPS, rien pour HTTPS->HTTP c.Header("Referrer-Policy", "strict-origin-when-cross-origin") // Permissions-Policy - Contrôle les fonctionnalités du navigateur // Désactive les fonctionnalités non nécessaires pour une API REST c.Header("Permissions-Policy", "geolocation=(), microphone=(), camera=()") // Content-Security-Policy (CSP) - Contrôle les ressources chargées // Pour une API REST, on peut être strict car on ne sert pas de HTML // default-src 'none': bloque tout par défaut // script-src 'none': bloque les scripts // style-src 'none': bloque les styles // img-src 'none': bloque les images // connect-src 'self': permet les requêtes vers la même origine (pour les appels API) c.Header("Content-Security-Policy", "default-src 'none'; script-src 'none'; style-src 'none'; img-src 'none'; connect-src 'self'") c.Next() } }