Configurer les en-têtes de sécurité HTTP de votre site
Les en-têtes de sécurité HTTP sont des consignes que votre serveur envoie au navigateur avec chaque page : n'ouvrir que du HTTPS, refuser d'être affiché dans la page d'un autre site, ne pas deviner le type d'un fichier. Les ajouter se fait en quelques lignes de configuration, sans toucher au contenu du site. Ce guide détaille les six en-têtes que notre audit vérifie et la façon de les mettre en place sur Apache et Nginx.
Dans la note Sécurité de l'audit, la Content-Security-Policy pèse le plus (poids 3), suivie de Strict-Transport-Security (poids 2) ; les quatre autres comptent chacun pour 1.
Les six en-têtes vérifiés et leur valeur de départ
- Strict-Transport-Security (HSTS) :
max-age=31536000; includeSubDomains. Oblige le navigateur à n'utiliser que HTTPS pour votre domaine. L'audit signale une durée (max-age) inférieure à 2 592 000 secondes (30 jours). N'ajoutezincludeSubDomainsque si tous vos sous-domaines sont servis en HTTPS. - X-Frame-Options :
SAMEORIGIN(ouDENY). Empêche l'affichage de vos pages dans une iframe d'un autre site, ce qui limite le clickjacking. - X-Content-Type-Options :
nosniff. Interdit au navigateur de deviner le type d'un fichier, par exemple d'exécuter comme script un fichier envoyé comme image. - Referrer-Policy :
strict-origin-when-cross-origin. Limite les informations d'adresse transmises aux sites vers lesquels vous envoyez vos visiteurs. - Permissions-Policy :
camera=(), microphone=(), geolocation=(). Désactive les fonctions du navigateur dont votre site n'a pas besoin ; retirez de la liste celles que vous utilisez. - Content-Security-Policy (CSP) : la plus efficace contre l'injection de scripts, et la plus délicate à régler (voir plus bas).
Configuration Apache
Dans le fichier .htaccess ou la configuration du site, avec le module mod_headers activé :
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
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"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
</IfModule>
Configuration Nginx
Dans le bloc server du site :
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" 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;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
Piège fréquent : dès qu'un bloc location déclare lui-même un add_header, Nginx n'hérite plus
de ceux du bloc parent. Répétez alors les en-têtes dans ce location.
Déployer une Content-Security-Policy sans casser le site
Une CSP trop stricte bloque des scripts ou des styles légitimes. La méthode sûre consiste à la publier d'abord en mode observation, qui signale les violations sans rien bloquer :
Content-Security-Policy-Report-Only: default-src 'self'; img-src 'self' data:; script-src 'self'; style-src 'self'
Parcourez le site, relevez dans la console du navigateur les ressources signalées, ajoutez les domaines réellement
utilisés, puis remplacez Content-Security-Policy-Report-Only par Content-Security-Policy.
Si une politique en observation existe déjà, l'audit le mentionne dans le constat.
Trois réglages font l'objet de constats distincts dans l'audit, car ils affaiblissent la politique :
'unsafe-inline': autorise tout script ou style écrit dans la page. Remplacez-le par un nonce (valeur aléatoire changée à chaque page) ou un hash.'unsafe-eval': autoriseeval(). Il vient souvent d'une ancienne bibliothèque JavaScript, à mettre à jour.- Le joker
*: autorise n'importe quel domaine. Listez les domaines précis à la place.
Les autres constats liés
- En-tête en double. Le même en-tête envoyé deux fois avec des valeurs différentes est ambigu pour le navigateur. Cherchez qui le pose en plus du serveur : CDN, proxy ou panneau d'hébergement, et supprimez un des deux.
- Version du serveur affichée. Apache :
ServerTokens Proddans la configuration du serveur. Nginx :server_tokens off;. Sur un mutualisé, demandez-le à l'hébergeur. - Scripts externes sans intégrité. Ajoutez l'attribut
integrity(etcrossorigin="anonymous") aux balisesscriptetlinkchargées depuis un autre domaine ; les CDN courants fournissent la valeur à copier.
Vérifier le résultat
Rechargez la page en vidant le cache, puis ouvrez l'onglet Réseau des outils du navigateur pour lire les en-têtes de la réponse principale. Lancez ensuite l'audit : les en-têtes présents passent en vert dans la catégorie Sécurité. Sur WordPress ou un hébergement mutualisé sans accès à la configuration, un plugin de sécurité ou une demande à l'hébergeur remplace l'édition manuelle. Pour la suite, voir aussi les attributs des cookies et la redirection HTTPS.
Sans compte, en 30 secondes
Vérifiez où en est votre site avant et après la correction.
Auditer mon site gratuitement →