49 lines
2.2 KiB
Go
49 lines
2.2 KiB
Go
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()
|
|
}
|
|
}
|