Checklist des en-têtes de sécurité HTTP (avec configurations à copier-coller)
Quelques en-têtes de réponse suffisent à bloquer des familles entières d'attaques (clickjacking, MIME sniffing, rétrogradation de protocole, une bonne part du XSS) pour un coût presque nul. Voici les en-têtes à envoyer, des valeurs de départ sûres, et la manière de déployer le plus délicat, la CSP, sans casser votre site.
La checklist
| En-tête | Valeur sûre | Protège contre |
|---|---|---|
Strict-Transport-Security | max-age=31536000; includeSubDomains | Rétrogradation vers HTTP et vol de cookies sur les Wi-Fi publics |
Content-Security-Policy | Commencer en mode report-only (voir ci-dessous) | XSS, scripts injectés, exfiltration de données |
X-Content-Type-Options | nosniff | Navigateurs exécutant des fichiers envoyés comme des scripts |
CSP frame-ancestors | 'self' (ou X-Frame-Options: SAMEORIGIN) | Clickjacking |
Referrer-Policy | strict-origin-when-cross-origin | Fuite d'URL complètes (jetons, identifiants) vers d'autres sites |
Permissions-Policy | camera=(), microphone=(), geolocation=() | Scripts tiers utilisant les fonctionnalités de l'appareil |
Vérifiez lesquels de ces en-têtes votre site envoie aujourd'hui, avec une note, grâce au Security Headers Checker.
HSTS : commencer court
Dès qu'un navigateur reçoit un en-tête HSTS, il refuse le HTTP simple pendant toute la durée de max-age. Assurez-vous d'abord que chaque sous-domaine fonctionne en HTTPS (vérifiez les certificats avec le SSL Checker), commencez avec max-age=300, puis passez à un an. Ajoutez preload et soumettez le site à la liste de préchargement HSTS uniquement lorsque vous êtes certain de votre choix : le retrait peut prendre des mois.
Content-Security-Policy sans tout casser
La CSP définit d'où peuvent provenir les scripts, styles, images et connexions. Déployez-la en mode report-only, qui journalise les violations sans rien bloquer :
Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self' https://www.googletagmanager.com; img-src 'self' data: https:; style-src 'self' 'unsafe-inline'; frame-ancestors 'self'; report-uri /csp-report
Surveillez la console du navigateur et votre point de collecte des rapports pendant une semaine, ajoutez les sources que vous utilisez réellement, puis remplacez le nom de l'en-tête par Content-Security-Policy. Évitez 'unsafe-inline' pour les scripts ; utilisez plutôt des nonces ou des empreintes (hashes) pour les scripts inline que vous maîtrisez. Construisez la politique source par source avec le CSP Generator.
Configurations
Nginx (dans le bloc server ; always conserve aussi les en-têtes sur les pages d'erreur) :
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
add_header Content-Security-Policy "frame-ancestors 'self'" always;
Apache (.htaccess, avec mod_headers) :
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
Vercel (vercel.json) :
{ "headers": [ { "source": "/(.*)", "headers": [
{ "key": "Strict-Transport-Security", "value": "max-age=31536000; includeSubDomains" },
{ "key": "X-Content-Type-Options", "value": "nosniff" },
{ "key": "Referrer-Policy", "value": "strict-origin-when-cross-origin" }
] } ] }
Générez des configurations serveur complètes avec le Nginx Config Generator ou le .htaccess Generator.
En-têtes que vous pouvez supprimer
X-XSS-Protection est obsolète : les navigateurs modernes ont supprimé le filtre qu'il contrôlait, et 0 est la valeur recommandée si vous l'envoyez encore. Expect-CT est déprécié. Masquer Server et X-Powered-By est une bonne pratique d'hygiène, mais ne constitue pas une protection réelle.