Aller au contenu

Insecure HTTP Header Setting: Content Security Policy (CSP)

Paramètre d'en-tête HTTP non sécurisé : Content Security Policy (CSP)

Description

La Content Security Policy (CSP) est une norme de sécurité informatique qui fournit une couche de protection supplémentaire contre les attaques par Cross-Site Scripting (XSS), le clickjacking et d'autres attaques côté client qui s'appuient sur l'exécution de contenu malveillant dans le contexte d'une ressource web de confiance.

Vous pouvez spécifier de manière sélective quelles sources de données doivent être autorisées dans votre application web en utilisant les directives CSP appropriées dans les en-têtes de réponse HTTP. Cet article montre comment utiliser les en-têtes CSP pour protéger les sites web contre les attaques XSS et d'autres tentatives de contournement de la politique de même origine (same-origin policy).

La CSP peut être activée en indiquant au navigateur une directive Content-Security-Policy dans un en-tête de réponse :

 Content-Security-Policy: script-src 'self';

Ou dans une balise meta :

<meta http-equiv="Content-Security-Policy" content="script-src 'self';"> 

Vous pouvez restreindre le chargement de scripts au même domaine dans l'exemple ci-dessus. Cela limitera également les exécutions de scripts en ligne (inline) dans les attributs d'éléments et les gestionnaires d'événements.

Il existe diverses directives que vous pouvez utiliser lors de la déclaration d'une CSP :

  • script-src : Restreint les ressources de chargement de scripts à celles que vous avez déclarées. Par défaut, il désactive les exécutions de scripts en ligne (inline) sauf si vous autorisez les fonctions d'évaluation et les scripts en ligne par les mots-clés unsafe-eval et unsafe-inline.
  • base-uri : L'élément base est utilisé pour résoudre une URL relative en une URL absolue. En utilisant cette directive CSP, vous pouvez définir toutes les URL possibles qui pourraient être attribuées à l'attribut base-href du document.
  • frame-ancestors : Très similaire à l'en-tête HTTP X-Frame-Options. Il définit les URL par lesquelles la page peut être chargée dans une iframe.
  • frame-src / child-src : frame-src est la version obsolète de child-src. Les deux définissent les sources qui peuvent être chargées par une iframe sur la page. (Veuillez noter que frame-src a été réintroduit dans CSP 3).
  • object-src : Définit les ressources qui peuvent être chargées par intégration, telles que les fichiers Flash et les applets Java.
  • img-src : Comme son nom l'indique, définit les ressources à partir desquelles les images peuvent être chargées.
  • connect-src : Définit les cibles sur liste blanche pour les objets XMLHttpRequest et WebSocket.
  • default-src : C'est une solution de repli (fallback) pour les directives se terminant principalement par le suffixe -src. Lorsque les directives ci-dessous ne sont pas définies, la valeur attribuée à default-src sera utilisée à la place :
    • child-src
    • connect-src
    • font-src
    • img-src
    • manifest-src
    • media-src
    • object-src
    • script-src
    • style-src

Lors de la configuration des directives CSP, vous pouvez également utiliser certains mots-clés CSP :

  • none : Refuse le chargement de ressources provenant de n'importe où.
  • self : Pointe vers l'URL du document (domaine + port).
  • unsafe-inline : Autorise l'exécution de scripts en ligne (inline).
  • unsafe-eval : Autorise l'exécution de fonctions d'évaluation telles que eval().

En plus des mots-clés CSP, vous pouvez utiliser un caractère générique (wildcard) ou uniquement un schéma lors de la définition des URL sur liste blanche pour les points de terminaison. Le caractère générique peut être utilisé pour les portions de sous-domaine et de port des URL :

Content-Security-Policy: script-src https://*.ostorlab.com;
Content-Security-Policy: script-src https://ostorlab.com:*;
Content-Security-Policy: script-src https://ostorlab.com:*;

Il est également possible de définir une CSP en mode Report-Only (rapport uniquement) au lieu de la forcer immédiatement pendant la période de migration. Ainsi, vous pouvez observer les violations de la politique CSP dans l'état actuel de votre site web pendant la migration vers CSP :

Content-Security-Policy-Report-Only: script-src 'self'; report-uri: https://ostorlab.com;

Prise en charge de la CSP par les navigateurs

La Content Security Policy est prise en charge par tous les principaux navigateurs modernes depuis de nombreuses années. Elle n'est pas prise en charge par Internet Explorer.

Chrome :

  • Content-Security-Policy CSP Level 3 - Chrome 59+ ( Prise en charge partielle )
  • Content-Security-Policy CSP Level 2 - Chrome 40+ ( Prise en charge complète depuis janvier 2015 )
  • Content-Security-Policy CSP 1.0 - Chrome 25+
  • X-Webkit-CSP Deprecated - Chrome 14-24

Firefox :

  • Content-Security-Policy CSP Level 3 - Firefox 58+ ( Prise en charge partielle )
  • Content-Security-Policy CSP Level 2 - Firefox 31+ ( Prise en charge partielle depuis juillet 2014 )
  • Content-Security-Policy CSP 1.0 - Firefox 23+ ( Prise en charge complète )
  • X-Content-Security-Policy Deprecated - Firefox 4-22

Safari :

  • Content-Security-Policy CSP Level 3 - Safari 15.4+ ( Prise en charge partielle )
  • Content-Security-Policy CSP Level 2 - Safari 10+
  • Content-Security-Policy CSP 1.0 - Safari 7+
  • X-Webkit-CSP Deprecated Safari 6

Edge :

  • Content-Security-Policy CSP Level 3 - Edge 79+ ( Prise en charge partielle )
  • Content-Security-Policy CSP Level 2 - Edge 15+ ( Prise en charge partielle, 76+ Complète )
  • Content-Security-Policy CSP 1.0 - Edge 12+

Internet Explorer :

  • X-Content-Security-Policy Deprecated - IE 10-11 ( prise en charge sandbox uniquement )

Recommandation

  • Activez la CSP sur votre site web en envoyant le Content-Security-Policy dans les en-têtes de réponse HTTP, ce qui indique au navigateur d'appliquer les politiques que vous avez spécifiées.
  • Appliquez la liste blanche et les politiques de manière aussi stricte que possible.
  • Analysez de nouveau votre application pour voir si Ostorlab identifie des faiblesses dans vos politiques.
  • Utilisez frame-src pour empêcher le chargement d'iFrames sur votre site : Content-Security-Policy:frame-src 'none'
  • Utilisez script-src pour empêcher le chargement de JavaScript sur votre site : Content-Security Policy:script-src 'none'
  • Restreignez le contenu autre que les images avec img-src : Content-Security-Policy: default-src 'self'; img-src *;
  • Utilisez default-src pour n'autoriser le chargement de contenu qu'à partir de la même origine, de votre site web et de ses sous-domaines : Content-Security-Policy: default-src 'self' *.sucuri.net;
  • N'autorisez les médias ou d'autres scripts exécutables qu'à partir de la même origine : Content-Security-Policy: default-src 'self'; img-src *; media-src sucuri.net; script-src sucuri.net;
  • N'autorisez les images, scripts, actions de formulaire et CSS qu'à partir de la même origine : default-src 'none'; script-src 'self'; img-src 'self'; style-src 'self';base-uri 'self';form-action 'self'

Liens

Normes

  • OWASP_ASVS_L3:
    • V2_2_5
  • PCI_STANDARDS:
    • REQ_6_2
    • REQ_6_3
    • REQ_6_4
    • REQ_11_3
  • HIPAA_CONTROLS:
    • SECURITY212
    • SECURITY213