Content Security Policy (CSP) — Durcissement Frontend
Déployer une CSP sans casser le site : directives clés, nonces/hashes, mode Report-Only, reporting, et pièges classiques (unsafe-inline).
14 mars 2026Peran2 min de lecture
#csp#web-security#xss#headers#browser-security#hardening
À quoi sert CSP ?
La Content Security Policy réduit l’impact des failles XSS et d’injections en limitant ce que le navigateur est autorisé à charger/exécuter.
- Contrôle des scripts, styles, images, connexions, iframes…
- Protection complémentaire (pas un substitut au correctif XSS).
Stratégie de déploiement (recommandée)
- Commencer en
Report-Onlypour mesurer la casse. - Itérer : corriger le code et réduire progressivement les exceptions.
- Basculer en enforcement (
Content-Security-Policy). - Garder un reporting (télémetrie) pour repérer les régressions.
Directives importantes
default-src
Base line : sources par défaut.
script-src
- Éviter
unsafe-inline. - Préférer nonce (par réponse) ou hash (pour scripts inline stables).
object-src
Souvent none.
base-uri
Souvent self.
frame-ancestors
Empêche le clickjacking (remplace X-Frame-Options dans beaucoup de cas).
connect-src
Contrôle les connexions XHR/fetch/WebSocket (API, analytics, etc.).
Exemple de CSP (générique)
Exemple à adapter (domaines, analytics, CDNs). Le but est de montrer la structure, pas de fournir une politique universelle.
Content-Security-Policy:
default-src 'self';
base-uri 'self';
object-src 'none';
frame-ancestors 'none';
img-src 'self' data:;
font-src 'self';
style-src 'self';
script-src 'self' 'nonce-<RANDOM_NONCE>';
connect-src 'self' https://api.example.com;
upgrade-insecure-requests;Nonces vs Hashes
- Nonce : idéal quand vous générez des scripts inline (frameworks) ; nécessite d’injecter la nonce dans les balises
<script>. - Hash : utile pour de petits scripts inline fixes ; casse si le contenu change.
Reporting
- Utiliser
Content-Security-Policy-Report-Onlyau début. - Définir un endpoint de rapport (selon support navigateur) pour collecter les violations.
Pièges fréquents
- Ajouter
unsafe-inline“temporairement” et ne jamais le retirer. - Oublier
connect-src(les appels API se font bloquer). - Trop permissif (
*,https:) : réduit fortement le gain.