Pourquoi ces headers sont critiques
Contrairement aux failles applicatives qui nécessitent des corrections de code, les headers HTTP de sécurité se configurent directement au niveau du serveur web. Un ajout de quelques lignes dans nginx ou Apache suffit à activer des protections que des millions de sites négligent encore.
Selon les analyses automatiques de Wezea, plus de 60 % des domaines scannés n'ont pas de Content-Security-Policy, et 45 % manquent de HSTS. Ces deux headers seuls élimineraient pourtant la majorité des vecteurs d'attaque côté navigateur.
L'absence de ces en-têtes n'est pas un simple défaut de configuration — c'est une porte ouverte aux attaques XSS, au sniffing de connexion et à l'injection de contenu malveillant via des iframes invisibles.
HSTS — forcer le HTTPS
HTTP Strict Transport Security (HSTS) indique au navigateur qu'il ne doit jamais accéder à votre site en HTTP clair — même si l'utilisateur tape l'URL sans "https://". Pendant la durée définie, le navigateur refuse automatiquement toute connexion non chiffrée.
# Header HSTS recommandé Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Le paramètre max-age=31536000 correspond à un an. includeSubDomains protège également tous vos sous-domaines. preload permet d'inscrire votre domaine dans la liste HSTS Preload de Chrome et Firefox — le navigateur connaît alors votre site comme HTTPS-only avant même d'y avoir accédé.
Assurez-vous que tous vos sous-domaines ont un certificat SSL valide avant d'activer
includeSubDomains. Un sous-domaine sans HTTPS deviendrait inaccessible.
Content-Security-Policy — bloquer les injections
La Content-Security-Policy (CSP) est le header le plus puissant — et le plus complexe à configurer. Elle définit quelles sources de contenu (scripts, styles, images, iframes) sont autorisées sur votre page. Une CSP bien réglée rend les attaques XSS quasiment inopérantes.
# CSP stricte pour un site statique Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted-cdn.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:; frame-ancestors 'none';
La directive default-src 'self' interdit tout contenu externe non explicitement autorisé. Chaque directive surcharge ce comportement par défaut pour sa catégorie. Commencez en mode rapport avec Content-Security-Policy-Report-Only pour ne pas casser votre site.
Les directives CSP les plus importantes
| Directive | Rôle | Valeur sécurisée |
|---|---|---|
default-src |
Fallback pour toutes les ressources | 'self' |
script-src |
Sources JavaScript autorisées | 'self' (éviter 'unsafe-inline') |
frame-ancestors |
Qui peut intégrer votre page en iframe | 'none' ou 'self' |
upgrade-insecure-requests |
Force HTTPS pour toutes les ressources | Toujours activer |
X-Frame-Options — stopper le clickjacking
Le clickjacking consiste à superposer votre site légitime dans une iframe invisible au-dessus d'une page piégée. L'utilisateur pense cliquer sur un bouton inoffensif mais déclenche une action sur votre site (achat, changement de mot de passe, validation de formulaire).
# Interdire l'intégration en iframe X-Frame-Options: DENY # Autoriser uniquement votre propre domaine X-Frame-Options: SAMEORIGIN
Note : frame-ancestors dans la CSP est la méthode moderne et remplace X-Frame-Options. Configurez les deux pour une compatibilité maximale avec les anciens navigateurs.
Les autres headers essentiels
X-Content-Type-Options
Empêche le navigateur de "deviner" le type MIME d'une réponse. Sans ce header, un attaquant peut servir un fichier malveillant déguisé en image ou texte, que le navigateur exécuterait comme du JavaScript.
X-Content-Type-Options: nosniff
Referrer-Policy
Contrôle quelles informations sont transmises dans l'en-tête Referer quand vos utilisateurs cliquent sur un lien externe. Évite de fuiter des URLs internes ou des tokens de session.
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy
Limite l'accès aux APIs du navigateur (caméra, microphone, géolocalisation) pour votre site et les iframes qu'il intègre. Particulièrement important si vous intégrez des widgets ou publicités tiers.
Permissions-Policy: camera=(), microphone=(), geolocation=()
Configurer sur nginx et Apache
nginx
# Dans le bloc server{} de votre vhost nginx add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; add_header X-Frame-Options "DENY" 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 "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; frame-ancestors 'none';" always;
Apache
# Dans votre .htaccess ou VirtualHost Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" Header always set X-Frame-Options "DENY" Header always set X-Content-Type-Options "nosniff" Header always set Referrer-Policy "strict-origin-when-cross-origin" # Activer le module headers si nécessaire a2enmod headers && systemctl reload apache2
always est important sous nginxSans
always, nginx n'envoie les headers que sur les réponses 200. Avec always, ils sont présents sur toutes les réponses, y compris les erreurs 4xx et 5xx.
Vérifier vos headers
Après avoir déployé vos headers, vérifiez qu'ils sont bien présents et correctement configurés. Plusieurs méthodes s'offrent à vous.
# Via curl en ligne de commande curl -I https://votre-domaine.com # Résultat attendu strict-transport-security: max-age=31536000; includeSubDomains; preload x-frame-options: DENY x-content-type-options: nosniff content-security-policy: default-src 'self'; ...
Wezea analyse automatiquement vos headers HTTP lors de chaque scan de domaine et signale les manquants avec leur niveau de risque associé.
Vérifiez vos headers HTTP maintenant
Wezea analyse en 60 secondes la présence et la validité de vos en-têtes de sécurité.
Lancer le scan gratuit →Gratuit · Sans inscription · Résultat immédiat