CentralCSP
PolitiquesContent-Security-PolicyValeurs

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émaStatutAutorise
https:✅ BonToute 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:✅ BonLes endpoints WebSocket sur connect-src (ws: correspond aussi à wss:).
mediastream:✅ BonLes 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.

Voir aussi

Sources

On this page