Tous les articles

En-têtes de sécurité d'un site web : ce que c'est et quoi demander

Six en-têtes HTTP qui indiquent au navigateur comment protéger les personnes qui visitent votre site. Ce que fait chacun, comment vérifier les vôtres, et des consignes prêtes pour votre développeur.

Radek, ENSOMEDIAPublié le 6 min de lectureIn EnglishPo polskuAuf DeutschEn español中文بالعربية

Quand quelqu'un ouvre votre site, le serveur envoie à son navigateur la page elle-même, plus quelques lignes d'instructions que le visiteur ne voit jamais. Ce sont les en-têtes HTTP. Certains indiquent au navigateur comment protéger les personnes sur votre site, par exemple se connecter uniquement par une connexion chiffrée, ou ne pas exécuter de scripts venant d'adresses inconnues.

Les en-têtes ne coûtent rien et se règlent une fois. Beaucoup de sites n'en ont pourtant pas, parce que la configuration par défaut d'un serveur les omet souvent. Si un contrôle de sécurité vous a dit que votre site « n'a pas d'en-têtes de sécurité », cet article explique ce que cela signifie et vous donne un texte prêt à envoyer à votre développeur.

Comment voir ce que votre site envoie

Le plus rapide est de passer par votre navigateur. Dans Chrome, Edge ou Firefox, ouvrez votre site et appuyez sur F12 (Cmd+Option+I sur Mac). Un panneau d'outils de développement s'ouvre. Choisissez l'onglet Réseau et rechargez la page. En haut de la liste, vous verrez une entrée portant l'adresse de votre site. Cliquez dessus et cherchez la section En-têtes de réponse.

Ignorez le reste du panneau. Vous cherchez seulement les noms décrits ci-dessous.

Le second moyen est un outil gratuit de contrôle des en-têtes, comme notre contrôle des en-têtes de sécurité (en anglais) ou le HTTP Observatory que Mozilla propose sur son site MDN. Vous saisissez votre adresse et obtenez une liste d'en-têtes avec une note. Prenez la note comme un indice, pas comme un verdict.

Strict-Transport-Security : toujours en HTTPS

Cet en-tête, HSTS en abrégé, dit au navigateur : pendant une durée donnée, ne te connecte à ce domaine qu'en HTTPS. Il protège par exemple les visiteurs sur un Wi-Fi public, où quelqu'un pourrait tenter d'intercepter cette première connexion non chiffrée.

Strict-Transport-Security: max-age=31536000; includeSubDomains

max-age est une durée en secondes, ici un an. Et voici le piège. Une fois que le navigateur a mémorisé cet en-tête, un visiteur qui rencontre un problème de certificat ne peut plus passer outre l'avertissement. includeSubDomains couvre tous les sous-domaines : si boutique.votredomaine.fr ou un test.votredomaine.fr oublié n'a pas de HTTPS fonctionnel, ils cesseront de s'ouvrir.

On commence donc par une durée courte, disons un jour, qu'on allonge quand tout fonctionne. N'ajoutez pas preload sans y avoir réfléchi, car il est très difficile à annuler.

Content-Security-Policy : une liste de sources de confiance

C'est le plus puissant des en-têtes, et le seul qui puisse vraiment casser votre site. CSP est la liste des endroits depuis lesquels vos pages ont le droit de charger des scripts, des styles, des images et des polices. Si un attaquant parvient à injecter un script malveillant, par exemple par un formulaire vulnérable, le navigateur refuse d'exécuter du code venant d'une adresse absente de la liste.

Le problème est que le site typique d'une petite entreprise s'appuie sur de nombreux services extérieurs : Google Analytics ou Tag Manager, le pixel Facebook, une fenêtre de chat, une carte, des polices web, des vidéos YouTube, une passerelle de paiement. Oubliez-en un dans la liste et cette partie du site cesse de fonctionner. Le chat disparaît, ou les clients ne peuvent plus payer.

C'est pourquoi CSP doit commencer en mode d'essai, sous le nom Content-Security-Policy-Report-Only. Dans ce mode, le navigateur ne bloque rien et signale seulement ce qu'il aurait bloqué. Votre développeur collecte ces rapports pendant une ou deux semaines de trafic normal, complète la liste, puis seulement bascule l'en-tête en mode d'application. Voici à quoi cela peut ressembler :

Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self' https://www.googletagmanager.com; img-src 'self' data: https:

Ce n'est qu'une illustration. La vraie liste dépend de ce qu'utilise votre site. Sur les sites qui ont beaucoup d'extensions, une CSP complète peut être difficile à mettre en place. Même alors, une politique partielle vaut mieux que rien.

Quatre en-têtes plus courts

X-Content-Type-Options: nosniff dit au navigateur de faire confiance au type de fichier déclaré par le serveur au lieu de le deviner. Sans lui, un fichier téléversé comme texte ou comme image pourrait dans certaines situations être traité comme un script. Il casse rarement quelque chose, tant que le serveur déclare correctement les types de fichiers.

X-Frame-Options: SAMEORIGIN empêche d'autres sites d'afficher le vôtre dans un cadre. Il protège contre le détournement de clic : quelqu'un charge votre page de façon invisible sous la sienne et pousse le visiteur à cliquer sur quelque chose qu'il ne voit pas, comme un bouton de commande. L'équivalent plus récent est frame-ancestors 'self' dans CSP, et vous pouvez régler les deux. Si votre site doit apparaître dans un cadre ailleurs, par exemple un calendrier de réservation sur le site d'un partenaire, votre développeur doit ajouter l'adresse de ce partenaire à frame-ancestors.

Referrer-Policy: strict-origin-when-cross-origin fait que, lorsque quelqu'un clique sur un lien de votre site vers un autre, ce dernier apprend seulement de quel domaine la personne vient, pas de quelle page. C'est important quand les adresses de vos pages contiennent quelque chose de privé, comme un numéro de commande. Les navigateurs modernes se comportent déjà ainsi par défaut, mais définir l'en-tête explicitement ne coûte rien.

Permissions-Policy: camera=(), microphone=(), geolocation=() déclare que votre site n'utilise ni la caméra, ni le microphone, ni la localisation. Même un script injecté ne peut alors pas demander au visiteur l'accès à ces fonctions. Si votre site propose un outil « trouver l'agence la plus proche » ou des consultations vidéo, votre développeur laissera activée la fonction dont vous avez besoin.

Des consignes prêtes pour votre développeur

Vous pouvez copier le texte ci-dessous et l'envoyer tel quel, avec votre propre adresse.

Merci d'ajouter des en-têtes de sécurité à votredomaine.fr,
sur toutes les pages, y compris l'administration et la boutique :

Strict-Transport-Security: max-age=86400; includeSubDomains
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=()
Content-Security-Policy-Report-Only: une politique correspondant
  aux scripts et services que nous utilisons réellement

Avant d'activer includeSubDomains, merci de vérifier que
tous les sous-domaines fonctionnent en HTTPS. Si rien ne casse
en une semaine, merci de passer max-age à 31536000.

CSP d'abord en mode Report-Only, pendant une ou deux semaines.
Envoyez-moi ensuite la liste des violations signalées
et décidons ensemble du moment du passage en mode d'application.

Merci aussi de m'indiquer où les en-têtes ont été définis
(configuration du serveur, .htaccess, Cloudflare ou une extension).

Cette dernière demande compte. Les en-têtes peuvent être définis à plusieurs endroits à la fois, et deux réglages différents pour le même en-tête sont une façon facile de semer la confusion à la prochaine modification. Une fois les en-têtes en place, vérifiez-les de nouveau et parcourez les parties les plus importantes : le formulaire de contact, le panier, le paiement, le chat, la carte et la connexion à l'administration.

Ce que les en-têtes ne corrigeront pas

Les en-têtes sont une deuxième ligne de défense. Ils ne corrigeront pas une extension obsolète ni un mot de passe faible. Ils limitent les dégâts quand autre chose échoue.

Ne courez pas non plus après la meilleure note d'un outil à tout prix. Un site avec cinq en-têtes simples et des paiements qui fonctionnent est dans une bien meilleure position qu'un site à la CSP parfaite qui empêche les clients de passer commande.

Un dernier point : si un outil vous dit d'ajouter un en-tête X-XSS-Protection, ne le traitez pas comme urgent. La plupart des navigateurs modernes l'ignorent, et le conseil actuel est soit de l'omettre, soit de le régler sur 0.