La directive HTTP Content-Security-Policy
(CSP) script-src
spécifie les sources valides pour du code JavaScript. Cela inclut non seulement les URL chargées directement par les éléments <script>
, mais aussi les scripts embarqués, les attributs de gestion d'évènements (onclick
) et les feuilles de style XSLT pouvant déclencher l'exécution de scripts.
Version de CSP | 1 |
---|---|
Type de directive | Fetch directive |
default-src par défaut |
Oui, si cette directive est absente, l'agent utilisateur consultera la directive default-src |
Syntaxe
Une ou plusieurs sources peuvent être autorisées pour cette directive :
Content-Security-Policy: script-src <source>; Content-Security-Policy: script-src <source> <source>;
Sources
La <source> peut être une des suivantes :
- <host-source>
- Des hôtes Internet par leur nom de domaine ou adresse IP, aussi bien qu'un protocole et/ou un numéro de port. L'adresse du site peut inclure un caractère de remplacement optionnel (l'astérisque
'*'
), qui ne peut être utilisée que pour indiquer un sous-domaine ou que tous les ports existants sont des sources valides.
Examples:http://*.example.com
: correspondra à toutes les tentatives d'accès pour tous les sous-domaines de example.com via le protocolehttp:
.mail.example.com:443
: correspondra à toutes les tentatives d'accès sur le port 443 de mail.example.com.https://store.example.com
: correspondra à toutes les tentatives d'accès à store.example.com via le protocolehttps:
.*.example.com
: correspondra à toutes les tentatives d'accès pour tous les sous-domaines de example.com en utilisant le protocole courant.
- <scheme-source>
- Un protocole tel que
http:
ouhttps:
. Les deux-points sont nécessaires. Contrairement à d'autres valeurs ci-bas, les guillemets ne devraient pas être employés. Vous pouvez aussi spécifier des schémas de données (quoi que ce ne soit pas recommandé).data:
permet aux URIdata:
d'être utilisées comme sources de contenu. Cette pratique manque de sécurité ; une personne malveillante peut aussi injecter des URI data: arbitraires. Utilisez cette valeur avec parcimonie certainement pas pour des scripts.mediastream:
permet aux URImediastream:
d'être utilisées comme source de contenu.blob:
permet aux URIblob:
d'être utilisées comme source de contenu.filesystem:
Allows URIfilesystem:
d'être utilisées comme source de contenu.
'self'
- Cette valeur fait référence au domaine dont est originaire le document protégé, y compris le protocole et le numéro de port. Vous devez mettre cette valeur entre guillemets. Certains navigateurs excluent spécifiquement les valeurs
blob
etfilesystem
des directives de source. Les sites nécessitant une permission pour ces types de contenu peuvent les spécifier en utilisant l'attribut Data. 'unsafe-eval'
- Permet l'usage de la fonction
eval()
et de méthodes similaires pour créer du code à partir de chaines de caractères. Vous devez mettre cette valeur entre guillemets. 'unsafe-hashes'
- Permet l'usage de certains écouteurs d'évènements par attributs. Si vous n'avez besoin que d'écouteurs d'évènements par attributs et non d'éléments
<script>
embarqués ou d'URLjavascript:
, cette valeur est plus sécurisée queunsafe-inline
. 'unsafe-inline'
- Permet l'usage de ressources embarquées, tels que des éléments
<script>
(sanssrc
), d'URLjavascript:
, de gestionnaire d'évènement par attributs (on<eventName>
), et d'éléments<style>
. Vous devez mettre cette valeur entre guillemets. 'none'
- Aucune source n'est admise. Vous devez mettre cette valeur entre guillemets.
- 'nonce-<base64-value>'
- Une liste de permissions pour des scripts embarqués spécifiques en utilisant un nonce (number used once, nombre à usage unique) cryptographique. Le serveur doit générer un nonce à chaque fois qu'il transmet une réponse. Il est extrèmement important de fournir des nonces non prédictibles, puisque le contraire permettrait aisément de contourner la stratégie de sécurité. Voir inline script non fiables pour avoir un exemple. Spécifier un nonce implique que les navigateurs modernes ignoreront la valeur
'unsafe-inline'
, qui peut toutefois être laissée pour les anciens navigateurs ne supportant pas les nonces. - '<hash-algorithm>-<base64-value>'
- Un hash sha256, sha384 ou sha512 d'un
<script>
ou d'un<style>
. L'usage de cette source consiste en deux parties séparées par un tiret : l'algorithme de chiffrage utilisé pour générer le hash à gauche et le hash encodé en base 64 à droite. Lors de la génération du hash, il ne faut pas inclure les balises<script>
or<style>
et tenir compte de la casse et des caractères blancs (espaces, retours à la ligne, etc.). Voir inline script non fiables pour en avoir un exemple. En CSP 2.0, cette valeur ne s'applique qu'aux scripts embarqués. CSP 3.0 le permet aussi dans le cas de scripts externes.
- 'strict-dynamic'
- La valeur
strict-dynamic
spécifie que la confiance explicitement donnée à un script de la page, par le biais d'un nonce ou d'un hash, doit être propagée à tous les scripts chargés par celui-ci. En conséquence, toute les valeurs telles que'self'
ou'unsafe-inline'
et listes de permissions sont ignorées. Voir script-src pour en avoir un exemple.
- 'report-sample'
- Requiert qu'un échantillon du code violant la directive soit inclut dans le rapport envoyé.
Exemples
Cas de violation
Soit cet en-tête CSP :
Content-Security-Policy: script-src https://example.com/
Ces scripts seront bloqués et ne seront pas chargés ou exécutés :
<script src="https://not-example.com/js/library.js"></script>
Notez que les gestionnaires d'évènements par attributs sont aussi bloqués :
<button id="btn" onclick="doSomething()">
Vous devez les remplacer par des appels à la méthode addEventListener
:
document.getElementById("btn").addEventListener('click', doSomething);
Scripts embarqués non fiables
Note : Bloquer les styles et scripts embarqués est l'une des stratégies de sécurité majeures que CSP propose. Toutefois, si vous en avez absolument besoin, il existe des mécanismes qui vous permettront de les autoriser.
Vous pouvez autoriser les scripts embarqués et les gestionnaires d'évènements par attributs en spécifiant la valeur 'unsafe-inline'
, des nonces ou des hashs correspondant au script.
Content-Security-Policy: script-src 'unsafe-inline';
Cette directive CSP autorisera tous les scripts <script>
embarqués :
<script>
var inline = 1;
</script>
Vous pouvez aussi utiliser un nonce pour autoriser spécifiquement certains éléments <script>
embarqués :
Content-Security-Policy: script-src 'nonce-2726c7f26c'
Vous devrez alors définir ce nonce sur l'élément <script>
:
<script nonce="2726c7f26c">
var inline = 1;
</script>
Autrement, vous pouvez créer des hashs à partir de vos scripts. CSP accepte les algorithmes sha256, sha384 et sha512.
Content-Security-Policy: script-src 'sha256-B2yPHKaXnvFWtRChIbabYmUBFZdVfKKXHbWtWidDVF8='
Lors de la génération du hash, vous ne devez pas inclure les balises et tenir compte de la casse et des caractères blancs (espaces, retours à la ligne, etc.).
<script>var inline = 1;</script>
Expressions d'évaluation non fiables
La valeur 'unsafe-eval'
contrôle différents méthodes qui créent du code JavaScript à partir de chaines de caractères. Si 'unsafe-eval'
n'est pas spécifiée avec la directive script-src
, ces méthodes seront bloquées et n'auront aucun effet :
eval()
Function()
- En passant une chaine à des méthodes tel que :
window.setTimeout("alert(\"Hello World!\");", 500);
window.execScript
(IE10 et versions précédentes)
strict-dynamic
La valeur 'strict-dynamic'
spécifie que la confiance explicitement donnée à un script de la page, par le biais d'un nonce ou d'un hash, doit être propagée à tous les scripts chargés par celui-ci. En conséquence, toute liste de permissions ou expressions de sources telles que 'self'
ou 'unsafe-inline'
sont ignorées. Par exemple, une règle telle que script-src 'strict-dynamic' 'nonce-R4nd0m' https://whitelisted.com/
autoriserait le chargement de scripts comme <script nonce="R4nd0m" src="https://example.com/loader.js">
et s'appliquerait ensuite à tous les scripts chargés par loader.js
, mais interdirait les scripts chargés depuis https://whitelisted.com/
à moins qu'ils soient accompagnés d'un nonce ou chargés depuis un script dont la source est de confiance.
script-src 'strict-dynamic' 'nonce-someNonce'
Ou
script-src 'strict-dynamic' 'sha256-base64EncodedHash'
Il est possible de déployer strict-dynamic
de manière rétrocompatible, sans chercher à connaitre l'agent utilisateur. Cette directive :
script-src 'unsafe-inline' https: 'nonce-abcdefg' 'strict-dynamic'
fonctionnera comme 'unsafe-inline' https:
pour les navigateurs supportant CSP1, https: 'nonce-abcdefg'
pour ceux supportant CSP2 et comme 'nonce-abcdefg' 'strict-dynamic'
pour ceux supportant CSP3.
Spécifications
Spécification | Statut | Commentaire |
---|---|---|
Content Security Policy Level 3 La définition de 'script-src' dans cette spécification. |
Version de travail | Inchangé. |
Content Security Policy Level 2 La définition de 'script-src' dans cette spécification. |
Recommendation | Initial definition. |
Compatibilité des navigateurs
BCD tables only load in the browser