Headers de sécurité : HSTS, CSP, X-Frame-Options et autres
· 7 min de lecture
En bref : Les headers HTTP de sécurité sont des lignes que le serveur ajoute à chaque réponse HTTP pour dire au navigateur comment traiter votre site. Correctement réglés, ils éliminent des classes entières d'attaques (XSS, clickjacking, MITM) - et ils sont gratuits.
En bref : Les headers HTTP de sécurité sont des lignes que le serveur ajoute à chaque réponse HTTP pour dire au navigateur comment traiter votre site. Correctement réglés, ils éliminent des classes entières d'attaques (XSS, clickjacking, MITM) - et ils sont gratuits.
Pourquoi c'est important
Une application peut être parfaitement sécurisée côté backend, mais sans headers corrects, toujours vulnérable aux attaques côté navigateur : cross-site scripting (XSS), clickjacking, protocol downgrade, MIME confusion. Les headers de sécurité poussent la défense dans le navigateur.
Strict-Transport-Security (HSTS)
Force HTTPS pour toutes les visites futures. Après la première visite HTTPS, le navigateur mémorise le domaine et réécrit lui-même tout lien http:// en https://, même si l'utilisateur clique sur une mauvaise réponse.
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
max-age=63072000= valide 2 ansincludeSubDomains= la règle s'applique aussi à tous les sous-domaines (attention : si vous avez un sous-domaine HTTP-only, ça le casse)preload= permet l'inclusion dans la liste HSTS preload intégrée à Chrome / Firefox / Safari
Attention :
HSTS avec preload prend 6+ mois pour retirer de la liste. N'incluez pas preload avant d'avoir vérifié que HTTPS fonctionne de manière stable pour tous les sous-domaines.
Content-Security-Policy (CSP)
Le header le plus puissant mais aussi le plus difficile à configurer. Whitelist d'où le navigateur peut charger scripts, styles, images, iframes. Sans CSP, un attaquant qui peut injecter une balise <script> peut exécuter n'importe quel JS - avec CSP seulement du code provenant de sources approuvées.
Content-Security-Policy: default-src 'self'; script-src 'self' 'sha256-...'; img-src 'self' data: https://cdn.example.com; style-src 'self' 'unsafe-inline'; frame-ancestors 'none'
Directives courantes :
default-src 'self'= par défaut autorise seulement les ressources de mon domainescript-src= sources JS (spécifiez hash ou nonce pour scripts inline)style-src= sources CSSimg-src= imagesconnect-src= AJAX, WebSocket, EventSourceframe-ancestors 'none'= personne ne peut embed la page dans iframe (mieux que X-Frame-Options)report-uri /csp-report= le navigateur envoie JSON à chaque violation (vous attrapez dans le backend et loggez)
X-Frame-Options
Alternative plus ancienne à frame-ancestors. Empêche le clickjacking - l'attaquant insère votre page comme iframe et la recouvre de boutons invisibles.
X-Frame-Options: DENY
Valeurs : DENY (personne), SAMEORIGIN (uniquement mon domaine), ALLOW-FROM uri (deprecated).
X-Content-Type-Options
X-Content-Type-Options: nosniff
Désactive le MIME sniffing - le navigateur respectera le Content-Type que le serveur a renvoyé. Sans ça, un attaquant peut uploader un fichier avec le mauvais type (par ex. une image qui est en réalité du HTML avec script) et le navigateur peut l'exécuter comme page web.
Referrer-Policy
Referrer-Policy: strict-origin-when-cross-origin
Contrôle combien d'informations sur la page précédente le navigateur envoie dans le header Referer au clic. Le défaut dans les navigateurs modernes est déjà strict-origin-when-cross-origin, mais le header déclaratif explicite assure la cohérence.
Permissions-Policy
Désactive les API dont vous n'avez pas besoin - caméra, microphone, GPS, géolocalisation. Un attaquant via XSS ne peut pas demander ces API.
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()
Configuration pratique en nginx
server {
listen 443 ssl http2;
server_name example.com;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "DENY" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
# CSP est étendu - définissez selon votre application
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; ..." always;
}
La clé est always - sans ça nginx omet les headers sur les réponses d'erreur (4xx, 5xx).
Audit de l'état actuel
Le plus facile via un outil en ligne. Notre header check vous montrera quels headers manquent et lesquels sont incorrects. Pour un audit approfondi, securityheaders.com donne aussi une note A-F.
Conclusion
Les headers de sécurité sont l'un des meilleurs investissements en rapport effort/gain dans le domaine de la sécurité - typiquement une demi-heure de setup en reverse proxy contre toute une catégorie d'attaques côté navigateur. Un audit une fois par semestre dans le cadre de la maintenance régulière est un minimum raisonnable.
Audit gratuit des security headers
Sans inscription, résultat en trois secondes.
Essayez ePulz.io gratuitement - 7 jours sans carte de crédit.
Créer un compte