Source de schéma
Comment fonctionnent les sources de schéma CSP comme https, data et blob, et pourquoi data et blob sont dangereux dans script-src mais sûrs dans img-src.
Dernière mise à jour:
Une source de schéma autorise toute ressource qui utilise un schéma d'URL donné,
écrit comme le nom du schéma suivi de deux-points, par exemple https:, data:
ou blob:. Elle est plus large qu'une
source d'hôte :
au lieu de nommer une origine, elle fait confiance à toute une classe d'URL. Cette
ampleur rend une source de schéma pratique pour certains types de ressources et
dangereuse pour d'autres.
Une source de schéma est sûre pour du contenu affiché comme les images et les polices, jamais pour du script :
Content-Security-Policy: img-src 'self' data:Syntaxe
Une source de schéma est un nom de schéma plus deux-points, sans hôte ni chemin. Les schémas que vous rencontrez dans une CSP :
| Schéma | Statut | Autorise |
|---|---|---|
https: | ✅ Bon | Toute ressource servie en HTTPS, depuis n'importe quel hôte. Très large ; préférez des hôtes explicites quand vous le pouvez. |
http: | ❌ Risqué | Toute ressource en HTTP simple, depuis n'importe quel hôte (il correspond aussi aux URL https:). |
data: | ❌ Risqué | Les URL data: inline. Dangereux dans script-src, style-src et object-src ; acceptable dans img-src et font-src. |
blob: | ❌ Risqué | Les URL blob: créées avec URL.createObjectURL(). Dangereux dans les contextes de script et de worker. |
ws: / wss: | ✅ Bon | Les endpoints WebSocket sur connect-src (ws: correspond aussi à wss:). |
mediastream: | ✅ Bon | Les URL mediastream: issues d'un périphérique de capture. De niche, media-src uniquement. |
filesystem: | ⚠️ Déprécié | Les URL filesystem: de l'ancienne API Filesystem de Chromium, de fait obsolète. |
Un wildcard * nu n'est pas la même chose qu'une source de schéma : * couvre
http: et https: et n'importe quel hôte, mais exclut délibérément data:,
blob: et filesystem:, qui doivent donc être nommés explicitement même à côté
de *.
Ce à quoi elle correspond
Une source de schéma correspond à toute URL utilisant ce schéma, quel que soit
l'hôte, le port ou le chemin. https: dans connect-src autorise un fetch()
vers n'importe quel endpoint HTTPS où qu'il soit. data: dans img-src autorise
n'importe quelle image inline encodée en URL data:.
Content-Security-Policy: font-src 'self' data:Cela laisse la page charger des polices auto-hébergées plus toute police embarquée
en URL data:, ce qui est courant quand un fichier CSS inline une petite police.
Pourquoi data: et blob: sont dangereux dans script-src et style-src
Une URL data: ou blob: transporte son propre contenu, donc l'autoriser dans
script-src
revient à laisser du script s'exécuter depuis une chaîne construite par la page,
ce qui est précisément le comportement que CSP existe pour empêcher. Un attaquant
capable d'influencer une URL data:, ou qui injecte du balisage qui en construit
une, peut exécuter du code arbitraire alors que la politique semble en vigueur. La
même chose vaut pour
style-src :
une feuille de style data: peut transporter du CSS injecté. Gardez data: et
blob: hors de script-src et style-src, et utilisez un
nonce ou un hash
pour le code inline auquel vous faites vraiment confiance.
Où les sources de schéma sont sûres
Pour les types de ressources non exécutables, une source de schéma est un choix
raisonnable et courant. data: dans
img-src
et
font-src
prend en charge les images inline et les polices embarquées avec peu de risque,
parce que ces octets sont affichés, pas exécutés. blob: est souvent nécessaire
dans img-src ou media-src pour les object URL que la page génère. La règle
simple : une source de schéma convient pour des données que vous affichez et
présente un risque pour du code que vous exécutez.
Valeurs non sûres à éviter
data: ou blob: dans script-src ou style-src est la valeur à éviter ; elle
rouvre le chemin du code inline qu'une politique est censée fermer. https: dans
script-src est également faible, parce qu'il fait confiance au script de chaque
hôte HTTPS du web, ce qui est à peine plus étroit que d'autoriser n'importe quel
script. Préférez
'strict-dynamic'
avec un nonce plutôt qu'une source de schéma pour le script.
Contre quoi cela protège
Utilisées correctement, les sources de schéma vous laissent permettre une classe
d'URL nécessaire (images inline, blobs générés) sans nommer chaque hôte, tout en
gardant verrouillées les directives exécutables. Vérifiez qu'une politique n'a pas
laissé data: ou blob: entrer dans une directive de script avec
l'évaluateur CSP.
Contournements et limites connus
Une source de schéma est grossière par conception : elle ne peut pas distinguer un
hôte de confiance d'un hôte hostile au sein du même schéma, donc https: dans
connect-src autorise l'exfiltration vers n'importe quel endpoint HTTPS. Quand
une directive n'a besoin que de quelques origines, préférez les sources d'hôte.
L'exclusion de data: et blob: du * est facile à oublier et mène à des images
cassées jusqu'à ce que le schéma soit ajouté explicitement.
Risques
Le risque principal est de dégainer une source de schéma comme correctif rapide
quand une requête est bloquée, et d'élargir une directive de script ou de
connexion bien plus que prévu. Ajoutez la source la plus étroite qui débloque la
ressource, testez-la en
mode Report-Only,
et gardez data:/blob: hors des directives exécutables.
Recommandation
Utilisez les sources de schéma uniquement pour du contenu affiché, et gardez la
confiance des scripts sur un
nonce ou un hash
avec 'strict-dynamic'.
Content-Security-Policy:
script-src 'nonce-{RANDOM}' 'strict-dynamic';
img-src 'self' data:;
font-src 'self' data:;
object-src 'none';
base-uri 'none'La cheat sheet CSP de l'OWASP
et le guide de CSP stricte de web.dev
mettent tous deux en garde contre data:, blob: ou un schéma large dans une
directive exécutable ; data: dans img-src et font-src est l'exception
courante et acceptable.
Exemples
Autoriser les images inline et les polices embarquées, avec le script verrouillé sur un nonce :
Content-Security-Policy:
default-src 'self';
img-src 'self' data:;
font-src 'self' data:;
script-src 'self' 'nonce-r4nd0m'Autoriser les object URL générées pour les médias :
Content-Security-Policy: media-src 'self' blob:Prise en charge par les navigateurs
Les sources de schéma font partie du cœur de CSP et sont largement prises en
charge par les navigateurs actuels. La règle du * qui exclut
data:/blob:/filesystem: est cohérente d'un moteur à l'autre.