Une Content Security Policy indique au navigateur depuis quelles sources une page peut charger des scripts, des styles, des images et d'autres ressources ; c'est la principale défense en profondeur contre le cross-site scripting (XSS). Elle est envoyée dans l'en-tête Content-Security-Policy, sous forme d'une liste de directives séparées par des points-virgules. Créez-en une avec le générateur d'en-tête CSP et évaluez un site réel avec l'analyseur d'en-têtes de sécurité. Les chaînes de repli ci-dessous proviennent de la spécification CSP Level 3.
Directives de récupération et leurs replis
Si une directive manque, le navigateur utilise la suivante de sa chaîne de repli ; s'il n'y en a aucune, ce type de ressource n'est pas restreint.
| Directive | Contrôle | Repli sur |
|---|---|---|
default-src |
Repli de toutes les directives de récupération ci-dessous | rien |
script-src |
JavaScript (éléments, attributs, eval) |
default-src |
script-src-elem |
Éléments <script> uniquement |
script-src → default-src |
script-src-attr |
Gestionnaires d'événements en ligne comme onclick |
script-src → default-src |
style-src |
Feuilles de style et styles en ligne | default-src |
style-src-elem |
<style> et <link rel="stylesheet"> |
style-src → default-src |
style-src-attr |
Attributs style="..." |
style-src → default-src |
img-src |
Images et favicons | default-src |
font-src |
Polices web | default-src |
connect-src |
fetch, XHR, WebSocket, EventSource, sendBeacon |
default-src |
media-src |
<audio>, <video>, pistes de texte |
default-src |
object-src |
Modules <object> et <embed> |
default-src |
manifest-src |
Manifeste d'application web | default-src |
child-src |
Cadres et workers (si les deux suivantes sont absentes) | default-src |
frame-src |
Contenu de <iframe> et <frame> |
child-src → default-src |
worker-src |
Workers web, partagés et de service | child-src → script-src → default-src |
Directives sans repli
default-src ne les couvre pas ; si vous les omettez, rien n'est restreint.
| Directive | Contrôle | Valeur typique |
|---|---|---|
base-uri |
URL autorisées dans <base href> |
'self' ou 'none' |
form-action |
Où les formulaires peuvent être envoyés | 'self' |
frame-ancestors |
Qui peut intégrer cette page dans un cadre (clickjacking) | 'none' ou 'self' ; remplace X-Frame-Options |
sandbox |
Applique à la page les restrictions d'un iframe en bac à sable | sandbox allow-scripts |
upgrade-insecure-requests |
Réécrit les URL http: des sous-ressources en https: |
aucune valeur |
report-to |
Groupe de la Reporting API qui reçoit les rapports de violation | un nom de groupe de Reporting-Endpoints |
report-uri |
URL qui reçoit les rapports de violation (obsolète, encore très prise en charge) | /csp-report |
require-trusted-types-for |
Impose Trusted Types pour les points d'entrée du XSS DOM | 'script' |
trusted-types |
Nomme les politiques Trusted Types autorisées | noms de politiques |
Expressions de source
| Expression | Autorise |
|---|---|
'none' |
Rien (doit être la seule valeur) |
'self' |
L'origine de la page elle-même (même schéma, même hôte, même port) |
https: |
Toute URL de ce schéma ; data:, blob: et les autres fonctionnent de la même façon |
example.com |
Cet hôte ; *.example.com couvre ses sous-domaines, pas le domaine nu |
https://cdn.example.com/js/ |
Ce préfixe de chemin sur cet hôte |
'unsafe-inline' |
<script>/<style> en ligne et gestionnaires d'événements ; ignoré si un nonce ou un hash est présent |
'unsafe-eval' |
eval(), new Function() et minuteries à chaîne |
'wasm-unsafe-eval' |
Compiler du WebAssembly sans autoriser le eval de JavaScript |
'nonce-<base64>' |
Éléments dont l'attribut nonce correspond ; générez une nouvelle valeur aléatoire à chaque réponse |
'sha256-<base64>' |
Contenu en ligne dont le hash correspond (sha384- et sha512- fonctionnent aussi) |
'strict-dynamic' |
Scripts chargés par un script déjà approuvé ; les listes d'hôtes et de schémas sont alors ignorées |
'unsafe-hashes' |
Permet aux hashes de correspondre aux gestionnaires d'événements et aux attributs style |
'report-sample' |
Inclut les 40 premiers caractères du code bloqué dans les rapports |
Règles de livraison
- En-tête ou meta.
<meta http-equiv="Content-Security-Policy" content="...">fonctionne, maisframe-ancestors,report-urietsandboxy sont ignorés, et le mode rapport seul ne peut pas être défini par meta. - Rapport seul.
Content-Security-Policy-Report-Onlyenvoie des rapports de violation sans rien bloquer : déployez d'abord toute nouvelle politique ainsi. - Plusieurs politiques. Si une réponse porte deux en-têtes CSP, une ressource doit satisfaire les deux ; ajouter une politique ne peut que durcir, jamais assouplir.
- Vérifiez ce qui est envoyé. Inspectez les vrais en-têtes de réponse d'une page avec le visionneur d'en-têtes HTTP.
Politiques de départ
| Objectif | Politique |
|---|---|
| Verrouiller un site statique | default-src 'self'; object-src 'none'; base-uri 'none'; frame-ancestors 'none'; form-action 'self' |
| Scripts stricts avec nonce | script-src 'nonce-R4nd0m' 'strict-dynamic'; object-src 'none'; base-uri 'none' |
| Autoriser un CDN et des images de partout en HTTPS | default-src 'self'; script-src 'self' https://cdn.example.com; img-src 'self' https: data: |
| Seulement bloquer le clickjacking | frame-ancestors 'self' |
| API qui ne renvoie que du JSON | default-src 'none'; frame-ancestors 'none' |
Le nonce R4nd0m représente une valeur nouvelle et imprévisible générée pour chaque réponse ; un nonce fixe n'apporte aucune protection.