HSTS et CSP
Sécurisation des communications et protection contre les attaques Web
Notions théoriques
Les sites Web modernes doivent protéger les utilisateurs contre diverses attaques.
3 mécanismes de sécurité HTTP permettent d'améliorer la protection des communications et des données :
- HSTS (HTTP Strict Transport Security) : Oblige un navigateur à utiliser HTTPS pour éviter les attaques de type "downgrade" vers HTTP.
- CSP (Content Security Policy) : Protège contre les attaques XSS (Cross-Site Scripting) en limitant les sources de contenu autorisées.
Il existe un ancien mécanisme, le HPKP (HTTP Public Key Pinning)** qui permettait de lier un site Web à une clé publique spécifique pour prévenir les attaques par faux certificats.
HPKP a été abandonné car une mauvaise configuration pouvait bloquer l'accès à un site de manière irréversible.
HSTS : Protection contre les attaques downgrade
HSTS est un en-tête HTTP qui force l'utilisation de HTTPS. Lorsqu'un navigateur visite un site avec HSTS activé, il enregistre cette règle et refusera toute connexion en HTTP.
Fonctionnement :
- Le serveur envoie l'en-tête
Strict-Transport-Security
avec une durée (max-age
). - Le navigateur applique cette règle pour toutes les connexions futures.
- Toute tentative de connexion en HTTP est automatiquement redirigée vers HTTPS.
Exemple d'en-tête HSTS :
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
CSP : Protection contre les attaques XSS
CSP est un en-tête HTTP qui contrôle les sources de contenu autorisées sur une page Web.
L'en-tête HTTP CSP empêche l'exécution de scripts malveillants injectés par un attaquant.
Fonctionnement :
- Le serveur envoie une politique CSP définissant les sources autorisées.
- Le navigateur bloque tout contenu ne respectant pas cette politique.
Exemple d'en-tête CSP :
Content-Security-Policy: default-src 'self'; script-src 'self' https://apis.example.com
Cette règle autorise uniquement les scripts provenant du même domaine ('self'
) et de apis.example.com
.
Exemple pratique
Il est possible de tester HSTS et CSP en configurant un serveur Web et en observant le comportement du navigateur.
1) Configuration de HSTS
- Modifier la configuration du serveur (Apache ou Nginx).
- Ajouter l'en-tête HSTS :
sous apache
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
sous nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
- Redémarrer le serveur et tester avec Chrome en tapant
chrome://net-internals/#hsts
.
2) Test de HSTS
- Accéder au site en HTTP (
http://example.com
). - Vérifier que la redirection vers HTTPS est automatique.
3) Configuration de CSP
- Ajouter l'en-tête CSP :
sous apache
Header set Content-Security-Policy "default-src 'self'; script-src 'self' https://apis.example.com"
sous nginx
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://apis.example.com";
- Tester en insérant un script non autorisé dans la console du navigateur.
4) Observation des violations CSP
- Ouvrir la console du navigateur (F12 > Console).
- Essayer d'exécuter un script inline :
alert("Test CSP");
- Observer si le navigateur bloque l'exécution.
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
L'objectif de ce TP est d'analyser le comportement de HSTS et CSP sur un site Web en utilisant un navigateur et les outils de développement.
1) Vérification de la présence de HSTS sur un site
- Ouvrir Google Chrome ou Mozilla Firefox.
- Accéder au site
https://www.google.com
. - Ouvrir les outils de développement (F12) et aller dans l'onglet Network.
- Recharger la page (F5) et sélectionner la première requête vers
www.google.com
. - Vérifier la présence de l'en-tête
Strict-Transport-Security
dans l'onglet Headers.
Une solution
Vous devez être connecté pour voir le contenu.
2) Observation du comportement de HSTS
- Ouvrir un terminal ou l'invite de commande.
- Tenter d'accéder à Google en HTTP avec la commande suivante :
curl -I http://www.google.com
- Observer la réponse du serveur.
Une solution
Vous devez être connecté pour voir le contenu.
3) Test de l'effet de HSTS dans le navigateur
- Ouvrir Chrome.
- Aller à
chrome://net-internals/#hsts
. - Dans la section Query HSTS/PKP domain, entrer
google.com
et cliquer sur Query. - Observer les informations affichées.
Une solution
Vous devez être connecté pour voir le contenu.
4) Vérification de la politique CSP d'un site
- Accéder au site
https://www.wikipedia.org
. - Ouvrir les outils de développement (F12) et aller dans l'onglet Network.
- Sélectionner la requête principale vers
www.wikipedia.org
. - Rechercher l'en-tête
Content-Security-Policy
dans l'onglet Headers.
Une solution
Vous devez être connecté pour voir le contenu.
5) Test de la politique CSP en injectant un script
- Ouvrir la console du navigateur (F12 > Console).
- Essayer d'exécuter un script inline :
alert("Test CSP");
- Observer si le navigateur bloque l'exécution.
Une solution
Vous devez être connecté pour voir le contenu.
6) Tentative de chargement d'un script externe non autorisé
- Dans la console du navigateur, tenter d'ajouter un script externe :
var script = document.createElement('script');
script.src = "http://example.com/malicious.js";
document.body.appendChild(script);
- Observer la réponse du navigateur.
Une solution
Vous devez être connecté pour voir le contenu.
7) Analyse des violations CSP dans la console
- Ouvrir les outils de développement (F12).
- Aller dans l'onglet Console.
- Observer les erreurs liées à CSP.
Une solution
Vous devez être connecté pour voir le contenu.
8) Modification temporaire de CSP pour tester une exception
- Ouvrir les outils de développement (F12).
- Aller dans l'onglet Network, puis Headers.
- Modifier temporairement l'en-tête
Content-Security-Policy
dans les requêtes (possible avec certaines extensions comme ModHeader). - Ajouter
unsafe-inline
à la directivescript-src
. - Retenter d'exécuter un script inline.
Une solution
Vous devez être connecté pour voir le contenu.