Comment fonctionne cette vérification
Scanaris demande ta page d'accueil comme le ferait un navigateur et lit les en-têtes de la réponse. Il cherche six en-têtes précis et, pour chacun qui manque, ouvre un constat avec une valeur recommandée : Content-Security-Policy, Strict-Transport-Security et X-Frame-Options en sévérité moyenne, et X-Content-Type-Options, Referrer-Policy et Permissions-Policy en sévérité faible. Il n'évalue pas ici la qualité de la CSP ni du HSTS : c'est le rôle des vérifications CSP faible et HSTS faible. Seule la réponse de l'URL scannée est examinée, donc si ton API vit sur un autre domaine, scanne-le à part.
Ce que protège chaque en-tête
- Content-Security-Policy limite d'où peuvent être chargés scripts, styles et images. C'est la défense principale contre l'injection de scripts (XSS).
- Strict-Transport-Security oblige le navigateur à toujours utiliser HTTPS avec ton domaine, même si quelqu'un tape l'adresse sans le s.
- X-Frame-Options empêche que ton site soit intégré dans l'iframe d'un autre, ce qui est la base du clickjacking.
- X-Content-Type-Options: nosniff empêche le navigateur de « deviner » le type d'un fichier et d'exécuter comme script quelque chose qui n'en était pas un.
- Referrer-Policy contrôle quelle part de l'URL est envoyée à d'autres sites quand un utilisateur clique sur un lien.
- Permissions-Policy désactive les API du navigateur que tu n'utilises pas, comme la caméra, le micro ou la géolocalisation.
Comment les ajouter selon ton hébergement
Vercel
Dans vercel.json, ou dans next.config avec la fonction headers() si tu utilises Next.js :
{
"headers": [
{
"source": "/(.*)",
"headers": [
{ "key": "Strict-Transport-Security", "value": "max-age=63072000; includeSubDomains; preload" },
{ "key": "X-Frame-Options", "value": "DENY" },
{ "key": "X-Content-Type-Options", "value": "nosniff" },
{ "key": "Referrer-Policy", "value": "strict-origin-when-cross-origin" },
{ "key": "Permissions-Policy", "value": "camera=(), microphone=(), geolocation=()" }
]
}
]
}
Netlify
Un fichier _headers dans le dossier publié :
/*
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=()
Nuxt
Dans nuxt.config, à l'intérieur de routeRules, la règle '/**' avec un objet headers et les mêmes paires clé-valeur. C'est exactement ce que fait Scanaris.
Express
import helmet from 'helmet';
app.use(helmet());
nginx
add_header Strict-Transport-Security "max-age=63072000; 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;
La Content-Security-Policy est volontairement absente des exemples : elle dépend des scripts et services que ton site charge et il vaut mieux la commencer en mode rapport. La procédure est dans les en-têtes de sécurité HTTP expliqués pour les humains.
Vérifie qu'ils sont là
curl -sI https://tondomaine.com | grep -iE "strict-transport|x-frame|x-content-type|referrer-policy|permissions-policy|content-security"
Les six lignes doivent apparaître. Si tu as un CDN devant le serveur, vérifie sur l'URL publique, parce que certains CDN retirent ou écrasent des en-têtes. L'analyseur d'en-têtes fait la même lecture avec une explication par en-tête.
Questions fréquentes
X-Frame-Options ou frame-ancestors ?
Les deux font la même chose ; frame-ancestors dans la CSP est la version moderne et permet de lister des domaines précis. Garde X-Frame-Options en plus pour les vieux navigateurs ; ils ne se gênent pas.
Puis-je casser le site en ajoutant ces en-têtes ?
Les cinq des exemples ne cassent rien sur un site normal. Le seul à risque est la CSP, c'est pourquoi on l'ajoute d'abord en mode Content-Security-Policy-Report-Only et on passe en mode bloquant quand les rapports sont propres.
Faut-il preload sur HSTS ?
Pas pour passer la vérification. preload permet d'inclure ton domaine dans la liste embarquée dans les navigateurs ; c'est un engagement à long terme (tout ton domaine et ses sous-domaines en HTTPS pour toujours), donc active-le seulement quand tu es sûr.