Je reçois un tas d'erreurs dans la console du développeur:
Refusé d'évaluer une chaîne
Refus d'exécuter le script en ligne car il viole la directive de politique de sécurité du contenu suivante
Refus de charger le script
Refus de charger la feuille de style
Qu'est-ce que tout cela signifie? Comment fonctionne la politique de sécurité du contenu? Comment utiliser l' Content-Security-Policy
en-tête HTTP?
Plus précisément, comment ...
- ... autoriser plusieurs sources?
- ... utilise des directives différentes?
- ... utilise plusieurs directives?
- ... gérer les ports?
- ... gérer différents protocoles?
- ... autoriser le
file://
protocole? - ... utiliser des styles, des scripts et des balises en ligne
<style>
et<script>
? - ... permettre
eval()
?
Et enfin:
- Que
'self'
signifie exactement ?
Réponses:
La
Content-Security-Policy
méta-balise vous permet de réduire le risque d' attaques XSS en vous permettant de définir d'où les ressources peuvent être chargées, empêchant les navigateurs de charger des données à partir d'autres emplacements. Cela rend plus difficile pour un attaquant d'injecter du code malveillant dans votre site.Je me suis cogné la tête contre un mur de briques en essayant de comprendre pourquoi j'obtenais des erreurs CSP les unes après les autres, et il ne semblait pas y avoir d'instructions concises et claires sur la façon dont cela fonctionne. Voici donc ma tentative d'expliquer brièvement certains points du CSP, en me concentrant principalement sur les choses que j'ai trouvé difficile à résoudre.
Par souci de concision, je n'écrirai pas la balise complète dans chaque échantillon. Au lieu de cela, je ne montrerai que la
content
propriété, donc un exemple qui ditcontent="default-src 'self'"
signifie ceci:1. Comment autoriser plusieurs sources?
Vous pouvez simplement lister vos sources après une directive en tant que liste séparée par des espaces:
Notez qu'il n'y a pas de guillemets autour des paramètres autres que les paramètres spéciaux , comme
'self'
. De plus, il n'y a pas de deux-points (:
) après la directive. Juste la directive, puis une liste de paramètres séparés par des espaces.Tout ce qui est en dessous des paramètres spécifiés est implicitement autorisé. Cela signifie que dans l'exemple ci-dessus, ces sources seraient valides:
Cependant, ceux-ci ne seraient pas valables:
2. Comment utiliser différentes directives, que font-elles chacune?
Les directives les plus courantes sont:
default-src
la politique par défaut pour le chargement de javascript, images, CSS, polices, requêtes AJAX, etc.script-src
définit des sources valides pour les fichiers javascriptstyle-src
définit des sources valides pour les fichiers cssimg-src
définit des sources valides pour les imagesconnect-src
définit des cibles valides pour XMLHttpRequest (AJAX), WebSockets ou EventSource. Si une tentative de connexion est effectuée avec un hôte non autorisé ici, le navigateur émulera une400
erreurIl y en a d'autres, mais ce sont ceux dont vous avez le plus besoin.
3. Comment utiliser plusieurs directives?
Vous définissez toutes vos directives à l'intérieur d'une méta-balise en les terminant par un point-virgule (
;
):4. Comment gérer les ports?
Tout sauf les ports par défaut doit être autorisé explicitement en ajoutant le numéro de port ou un astérisque après le domaine autorisé:
Ce qui précède entraînerait:
Comme je l'ai mentionné, vous pouvez également utiliser un astérisque pour autoriser explicitement tous les ports:
5. Comment gérer différents protocoles?
Par défaut, seuls les protocoles standard sont autorisés. Par exemple, pour autoriser WebSockets,
ws://
vous devrez l'autoriser explicitement:6. Comment autoriser le protocole de fichier
file://
?Si vous essayez de le définir comme tel, cela ne fonctionnera pas. Au lieu de cela, vous l'autoriserez avec le
filesystem
paramètre:7. Comment utiliser les scripts en ligne et les définitions de style?
Sauf autorisation explicite, vous ne pouvez pas utiliser de définitions de style en ligne, de code à l'intérieur de
<script>
balises ou dans des propriétés de balise commeonclick
. Vous les autorisez ainsi:Vous devrez également autoriser explicitement les images encodées en base64:
8. Comment autoriser
eval()
?Je suis sûr que beaucoup de gens diraient que vous ne le faites pas, car «l'évaluation est mauvaise» et la cause la plus probable de la fin imminente du monde. Ces gens auraient tort. Bien sûr, vous pouvez définitivement percer des trous majeurs dans la sécurité de votre site avec eval, mais il a des cas d'utilisation parfaitement valides. Il suffit d'être intelligent pour l'utiliser. Vous le permettez ainsi:
9. Que
'self'
signifie exactement ?Vous pourriez
'self'
vouloir dire localhost, système de fichiers local ou quoi que ce soit sur le même hôte. Cela ne signifie rien de tout cela. Cela signifie des sources qui ont le même schéma (protocole), le même hôte et le même port que le fichier dans lequel la politique de contenu est définie. Servir votre site via HTTP? Pas de https pour vous alors, sauf si vous le définissez explicitement.J'ai utilisé
'self'
dans la plupart des exemples car il est généralement logique de l'inclure, mais ce n'est en aucun cas obligatoire. Laissez-le de côté si vous n'en avez pas besoin.Mais attendez une minute! Je ne peux pas simplement l'utiliser
content="default-src *"
et en finir avec ça?Non. Outre les failles de sécurité évidentes, cela ne fonctionnera pas non plus comme prévu. Même si certains documents affirment qu'il autorise tout, ce n'est pas vrai. Cela n'autorise pas l'inline ou les évales, donc pour vraiment, vraiment rendre votre site très vulnérable, vous utiliseriez ceci:
... mais j'espère que non.
Lectures complémentaires:
http://content-security-policy.com
http://en.wikipedia.org/wiki/Content_Security_Policy
la source
default-src *; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'; img-src * data: 'unsafe-inline'; connect-src * 'unsafe-inline'; frame-src *;
content="default-src * 'unsafe-inline' 'unsafe-eval'"
est nécessaire pour faire fonctionner certaines applications angulaires.connect-src
et chemins: les barres obliques de fin sont obligatoires si vous souhaitez inclure un sous-chemin entier. Par exemple: le fichierhttp://foo.com/files/bar.txt
sera bloqué si la source esthttp://foo.com/files
, mais servi quand il esthttp://foo.com/files/
APACHE2 MOD_HEADERS
Vous pouvez également activer Apache2 mod_headers, sur Fedora, il est déjà activé par défaut, si vous utilisez Ubuntu / Debian, activez-le comme ceci:
Sur Ubuntu / Debian, vous pouvez configurer les en-têtes dans le fichier
/etc/apache2/conf-enabled/security.conf
Remarque: il s'agit de la partie inférieure du fichier, seules les 3 dernières entrées sont des paramètres CSP.
Le premier paramètre est la directive, les seconds sont les sources à mettre sur liste blanche. J'ai ajouté Google Analytics et un adserver, que vous pourriez avoir. De plus, j'ai trouvé que si vous avez des alias, par exemple, www.example.com et example.com configurés dans Apache2, vous devez également les ajouter à la liste blanche.
Le code en ligne est considéré comme dangereux, vous devez l'éviter. Copiez tous les javascripts et css dans des fichiers séparés et ajoutez-les à la liste blanche.
Pendant que vous y êtes, vous pouvez jeter un œil aux autres paramètres d'en-tête et installer mod_security
Lectures complémentaires:
https://developers.google.com/web/fundamentals/security/csp/
https://www.w3.org/TR/CSP/
la source
N'oubliez pas la police-src, elle fonctionne de la même manière que toute autre, mais si vous utilisez des polices chargées d'autres origines - assurez-vous de l'ajouter à la balise META
la source