Content-Security-Policy (CSP)
Indiquer au navigateur quels contenus il peut charger ou exécuter afin de bloquer les contenus inattendus ou malveillants.
Comprendre Content-Security-Policy
Content-Security-Policy, souvent abrégé en CSP, est une règle de sécurité envoyée par un site web au navigateur.
Elle indique au navigateur quels contenus sont autorisés à être chargés ou exécutés : scripts JavaScript, feuilles de style, images, polices, vidéos, contenus intégrés ou connexions vers des services externes.
On peut voir CSP comme une liste d’autorisation : les contenus prévus par le site peuvent fonctionner, tandis que ceux provenant d’une source non autorisée peuvent être bloqués par le navigateur.
Pourquoi est-ce important ?
Une page web utilise souvent des ressources provenant de plusieurs endroits : le site lui-même, un CDN, un service de statistiques, une police externe, une vidéo ou encore différents services tiers.
Si un contenu malveillant parvient à être injecté dans la page, le navigateur pourrait tenter de le charger ou de l’exécuter. Une CSP correctement configurée permet de refuser les contenus qui ne correspondent pas aux sources ou aux comportements autorisés.
Elle constitue notamment une protection importante contre certaines conséquences des attaques de type XSS (Cross-Site Scripting), dans lesquelles du code malveillant peut être injecté puis exécuté dans une page légitime.
Comment ça fonctionne ?
Le serveur ajoute un en-tête HTTP nommé
Content-Security-Policy
dans sa réponse.
Cet en-tête contient différentes règles appelées directives. Chacune indique au navigateur ce qui est autorisé pour un type de contenu particulier.
Le navigateur applique ensuite ces règles lorsqu’il affiche la page. Si une ressource ou une action ne respecte pas la politique définie, elle peut être bloquée.
Configurer une CSP
Un exemple simple
Voici un exemple volontairement très simple :
Content-Security-Policy: default-src 'self';
La valeur
'self'
signifie ici que les ressources doivent provenir
du même site.
Dans un site réel, la politique doit généralement être plus détaillée afin d’autoriser précisément les ressources réellement nécessaires tout en refusant les autres.
Les principales directives
default-src
Définit la règle générale utilisée lorsqu’aucune directive plus précise n’est indiquée.
script-src
Indique quelles sources sont autorisées à fournir ou exécuter des scripts JavaScript.
style-src
Définit les sources autorisées pour les feuilles de style CSS.
img-src
Contrôle les sources depuis lesquelles les images peuvent être chargées.
font-src
Détermine les sources autorisées pour les polices de caractères.
connect-src
Encadre les connexions effectuées par la page vers des API ou des services externes.
frame-src
Définit quels contenus externes peuvent être intégrés dans des cadres comme les iframes.
frame-ancestors
Indique quels sites ont le droit d’intégrer la page courante dans une iframe. Cette directive permet notamment de lutter contre le clickjacking.
object-src
Contrôle certains contenus intégrés plus anciens ou spécifiques, comme les objets externes.
base-uri
Permet de limiter les adresses pouvant être utilisées comme base pour les liens relatifs de la page.
form-action
Détermine vers quelles adresses les formulaires de la page peuvent envoyer des données.
Mettre en place une CSP sans casser le site
Une CSP doit être adaptée au fonctionnement réel du site. Si une ressource légitime n’est pas autorisée, le navigateur peut la bloquer.
Une mauvaise configuration peut par exemple :
- empêcher un script JavaScript de fonctionner ;
- bloquer une feuille de style ou une police ;
- empêcher l’affichage d’une image ou d’une vidéo ;
- bloquer une connexion vers une API ou un service externe nécessaire au site.
Ce risque ne doit toutefois pas conduire à renoncer à CSP. La politique doit être préparée, testée puis progressivement renforcée jusqu’à obtenir une configuration adaptée.
Commencer avec Report-Only
Pour préparer une politique sans bloquer immédiatement les ressources du site, il existe un en-tête appelé :
Content-Security-Policy-Report-Only
Ce mode permet au navigateur de constater les violations de la politique sans appliquer immédiatement les blocages.
Il est ainsi possible d’identifier les ressources ou comportements qui poseraient problème, puis d’ajuster progressivement la configuration.
Content-Security-Policy.
Une fois la politique testée et validée,
elle doit être activée afin que le navigateur
bloque réellement les contenus non autorisés.
Bonnes pratiques et limites
Bonnes pratiques
-
Mettre en place une
Content-Security-Policyadaptée au fonctionnement réel du site. - Autoriser uniquement les sources réellement nécessaires.
- Éviter les règles trop larges ou trop permissives.
- Tester la politique avant son activation complète.
-
Utiliser
Content-Security-Policy-Report-Onlypendant la phase de préparation lorsqu’une politique doit être ajustée progressivement. -
Une fois la politique validée,
l’activer réellement avec
Content-Security-Policy. - Réexaminer régulièrement la politique, notamment lorsque le site ajoute ou retire des scripts, des services externes, des API ou d’autres ressources.
Ce que CSP ne remplace pas
CSP est une couche de protection supplémentaire essentielle, mais elle ne remplace pas :
- la sécurité du code ;
- les mises à jour du site, du CMS et de ses dépendances ;
- une configuration correcte du serveur ;
- les autres protections de sécurité nécessaires au site.
Une CSP correctement configurée peut empêcher ou limiter de nombreuses attaques liées au chargement ou à l’exécution de contenus non prévus. Elle doit donc être considérée comme une protection à mettre en place, et non comme une option facultative.
Content-Security-Policy-Report-Only
permet de préparer progressivement la politique
avant son activation réelle.