En-têtes de sécurité : comment les ajouter à votre site
HSTS, CSP, X-Frame-Options, X-Content-Type-Options et Referrer-Policy : à quoi ils servent et comment les ajouter avec Cloudflare, Apache ou Nginx.
À quoi servent ces en-têtes?
Les en-têtes de sécurité sont des consignes que le serveur envoie au navigateur avec chaque page. Redirect Audit vérifie la présence de cinq d’entre eux sur la page finale :
- Strict-Transport-Security (HSTS) : le navigateur utilisera toujours HTTPS pour votre site, même si quelqu’un tape
http://. - Content-Security-Policy (CSP) : limite les ressources que la page peut charger ou les sites qui peuvent l’afficher dans un cadre.
- X-Frame-Options : empêche un autre site d’afficher le vôtre dans un cadre invisible (clickjacking). La directive
frame-ancestorsde CSP joue le même rôle. - X-Content-Type-Options : empêche le navigateur de deviner le type d’un fichier.
- Referrer-Policy : limite l’information de provenance transmise aux autres sites.
Ils ne remplacent pas les mises à jour ni un hébergement bien configuré, mais ils réduisent l’effet de certaines attaques. Leur présence ne garantit pas qu’ils soient bien réglés : Redirect Audit vérifie seulement qu’ils existent.
Des valeurs de départ sûres
Ces valeurs conviennent à la plupart des sites et ne bloquent pas de contenu :
Strict-Transport-Security: max-age=31536000
Content-Security-Policy: frame-ancestors 'self'; base-uri 'self'; object-src 'none'
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
HSTS, prudemment : une fois reçu, le navigateur refusera le site en HTTP pendant toute la durée de max-age. Commencez par une courte durée (max-age=300, soit 5 minutes), vérifiez que tout fonctionne en HTTPS, puis passez à un jour, puis à un an. N’ajoutez includeSubDomains que si tous vos sous-domaines fonctionnent en HTTPS, et preload seulement si vous êtes certain de garder HTTPS pour toujours : ce choix est très difficile à annuler.
CSP : la politique ci-dessus protège contre l’affichage dans un cadre et quelques abus, mais pas contre l’injection de scripts. Une politique complète (script-src, style-src, etc.) dépend de chaque site : testez-la d’abord avec l’en-tête Content-Security-Policy-Report-Only, qui signale les blocages sans rien bloquer, avant de l’appliquer.
Cloudflare
HSTS : dans SSL/TLS → Edge Certificates, section HSTS, cliquez sur Enable HSTS, lisez l’avertissement et choisissez une durée (Max Age). La même page propose l’option No-Sniff Header, qui ajoute X-Content-Type-Options: nosniff.
Les autres en-têtes : dans Rules → Overview, créez une Response Header Transform Rule qui s’applique à toutes les requêtes, avec l’opération Set static pour chaque en-tête :
Content-Security-Policy=frame-ancestors 'self'; base-uri 'self'; object-src 'none'X-Frame-Options=SAMEORIGINX-Content-Type-Options=nosniff(si l’option No-Sniff n’est pas déjà activée)Referrer-Policy=strict-origin-when-cross-origin
À noter : le raccourci Managed Transforms → Add security headers ajoute aussi deux en-têtes devenus inutiles (X-XSS-Protection et Expect-CT), mais ni HSTS ni CSP. Une règle personnalisée donne un résultat plus propre.
Apache et LiteSpeed
Avec le module mod_headers, ajoutez ceci dans le VirtualHost HTTPS :
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000"
Header always set Content-Security-Policy "frame-ancestors 'self'; base-uri 'self'; object-src 'none'"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
</IfModule>
- Gardez le mot
always: sans lui, Apache n’envoie pas ces en-têtes sur les redirections ni sur les pages d’erreur. - Le même bloc fonctionne dans un fichier
.htaccess(c’est souvent le seul accès sur un hébergement mutualisé ou sous LiteSpeed), mais il ne s’applique alors pas aux redirections définies dans la configuration du serveur. Si vous avez le choix, préférez le VirtualHost.
Nginx
Dans le bloc server HTTPS :
add_header Strict-Transport-Security "max-age=31536000" always;
add_header Content-Security-Policy "frame-ancestors 'self'; base-uri 'self'; object-src 'none'" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
- Le mot
alwaysles ajoute aussi aux pages d’erreur (404, 500…). - Piège fréquent : un bloc
locationqui contient son propreadd_header(par exempleCache-Control) n’hérite plus d’aucun en-tête du blocserver. Placez les cinq lignes dans un fichier, par exemplesecurity-headers.conf, et ajoutezinclude security-headers.conf;dans le blocserveret dans chaquelocationqui a ses propresadd_header. Depuis Nginx 1.29.3, la directiveadd_header_inherit merge;dans le bloclocationrègle aussi ce problème.
Lancez nginx -t, puis rechargez Nginx.
WordPress
WordPress n’a pas de réglage pour ces en-têtes. Ajoutez-les plutôt au niveau du serveur ou de Cloudflare, comme ci-dessus. Certaines extensions de sécurité ou de cache peuvent aussi les ajouter : évitez de les définir à deux endroits avec des valeurs différentes.
Vérifier le résultat
Revérifiez votre domaine dans Redirect Audit : le panneau « En-têtes de sécurité » doit afficher 5/5. Pour une analyse plus poussée des valeurs, utilisez aussi securityheaders.com. Parcourez enfin quelques pages du site : si un élément ne s’affiche plus, c’est généralement la CSP qu’il faut ajuster.
Ces exemples sont un point de départ : adaptez-les à votre configuration et testez-les avant de les appliquer à un site en production.