Implémentez les CSP sur votre site
Si vous êtes familier avec les en-têtes de sécurité HTTP, vous avez peut-être déjà entendu parler des content security policies, sans jamais oser les implémenter pour ne pas risquer de bloquer des composants de votre site.
Je vous propose de voir de quoi il s’agit et comment les mettre en place, sans tout casser !
Principe des CSP
Les CSP font partie des en-têtes de sécurité à implémenter sur le serveur Web.
Ces politiques permettent de lister les ressources par catégorie afin d’évier qu’une ressource externe non prévue exécute du code sur votre site.
Il faut alors lister d’où sont censés venir les images, les styles, les scripts, …
Directives possibles
Directive | Rôle |
---|---|
default-src | Politique par défaut pour toutes les ressources. |
script-src | Politique pour les scripts JS |
object-src | Politique pour les plugins |
style-src | Politique pour les CSS |
img-src | Politique pour les images |
media-src | Politique pour les ressources vidéo ou audio |
frame-src | Politique pour les iframe embarqués dans la page |
font-src | Politique pour les polices de caractères |
form-action | Politique des actions que les formulaires peuvent appeler |
sandbox | Politique de “bac à sable” pour les ressources protégées |
script-nonce | Politique pour les scripts qui requièrent l’attribut ’nonce' |
plugin-types | Définit quel plugin peut être appelé |
reflected-xss | Activation/Désactivation des filtrage X-XSS |
report-uri | Définir une URI à laquelle envoyer les stats sur le fonctionnement des CSP |
Politiques possibles
Politique | Explication |
---|---|
“*” | Autorise toutes les ressources (à éviter) |
“none” | Interdit ce type de ressources |
“self” | Autorise les ressources provenant du même sous-domaine que la page elle-même |
“unsafe-inline” | Pour JS et CSS : Autorise le code JS ou CSS directement dans le code source (à éviter) |
“unsafe-eval” | Pour JS : Autorise les mécanismes comme eval() (à éviter) |
" | https://ledomaine.source.com/laressource/" Autorise une URI en particulier |
Wildcards, | par exemples : |
“https://*” | " https://*" : Autorise toute ressources mais en HTTPS seulement (à éviter) |
“https://ledomaine.com/” | “https://ledomaine.com/” : Autorise toute ressource venant de ledomaine.com ou de ses sous-domaines (le plus précis sera le mieux). |
Méthode de mise en place
- Lister les ressources appelées
a. On peut utiliser la console développeur Firefox/Chrome pour voir les requêtes GET et en déduire les appels b. On peut regarder le code source de la page c. Lister les ressources
- Créer les règles CSP adaptées (exemple)
Ressource | Origine | Règle CSP |
---|---|---|
Image | Balise dans le code HTML | img-src: ‘self’ |
Image | Image dans le code CSS provenant du site lui-même | img-src: ‘self’ |
CSS | Styles venant d’un CDN | style-src: ’ https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css' ou bien : style-src: ‘https://maxcdn.bootstrapcdn.com/bootstrap/*/css/bootstrap.min.css’ |
CSS | Intégré au code source (balise style) | style-src: ‘unsafe-inline’ |
CSS | Depuis le même domaine | style-src: ‘self’ |
JS | Scripts venant d’un CDN | script-src: ‘https://ajax.googleapis.com/ajax/libs/jquery/* ' |
JS | Depuis le même domaine | script-src: ‘self’ |
… | … | … |
- Exemple de règles qu’on obtient :
Content-Security-Policy: default-src 'self'; style-src: 'https://maxcdn.bootstrapcdn.com/bootstrap/*/css
/bootstrap.min.css' 'unsafe-inline' 'self'; script-src 'https://ajax.googleapis.com/ajax/libs/jquery/*'
'self';
Cette règle s’ajoute sur le serveur Web sous cette forme :
Header always set content-security-policy "default-src 'self';"
- Ajouter une règle report-to :
Content-Security-Policy-Report-Only: report-uri /csp-violation-report-endpoint/
- Créer un compte sur Report-uri.io
- Les mettre en place en Dev ou Valid
- Vérifier avec report-uri.io si les règles sont correctes
- Les passer en Valid et en Prod