Comment utiliser la politique de sécurité de contenu de Django¶
Configuration de base¶
Pour activer la politique de sécurité de contenu (CSP) dans votre projet Django :
Ajoutez l’intergiciel CSP à votre réglage
MIDDLEWARE:MIDDLEWARE = [ # ... "django.middleware.csp.ContentSecurityPolicyMiddleware", # ... ]
Configurez les politiques CSP dans votre fichier
settings.pyen utilisantSECURE_CSPouSECURE_CSP_REPORT_ONLY(ou les deux). La documentation des réglages CSP fournit plus de détails sur les différences entre les deux :from django.utils.csp import CSP # To enforce a CSP policy: SECURE_CSP = { "default-src": [CSP.SELF], # Add more directives to be enforced. } # Or for report-only mode: SECURE_CSP_REPORT_ONLY = { "default-src": [CSP.SELF], # Add more directives as needed. "report-uri": "/path/to/reports-endpoint/", }
Configuration du nonce¶
Pour utiliser des nonces dans votre politique CSP, en plus de la configuration de base, vous devez :
Inclure la valeur du substituant
NONCEdans les réglages CSP. Cela ne s’applique qu’aux directivesscript-srcoustyle-src:from django.utils.csp import CSP SECURE_CSP = { "default-src": [CSP.SELF], # Allow self-hosted scripts and script tags with matching `nonce` attr. "script-src": [CSP.SELF, CSP.NONCE], # Example of the less secure 'unsafe-inline' option. "style-src": [CSP.SELF, CSP.UNSAFE_INLINE], }
Ajouter le processeur de contexte
csp()à votre réglageTEMPLATES. Cela rendra disponible dans les gabarits la valeur nonce générée sous la forme de la variable de contextecsp_nonce:TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "OPTIONS": { "context_processors": [ # ... "django.template.context_processors.csp", ], }, }, ]
Dans vos gabarits, ajouter le nonce aux éléments qui l’exigent :
Pour les balises
<style>or<script>en ligne, utilisez directement la variable de contextecsp_nonce:<style nonce="{{ csp_nonce }}"> /* These inline styles will be allowed. */ </style> <script nonce="{{ csp_nonce }}"> // This inline JavaScript will be allowed. </script>
Pour les éléments
<script src="...">et<link rel="stylesheet">externes, utilisez la balise de gabaritcsp_nonce_attr:<script src="/path/to/script.js" {% csp_nonce_attr %}></script> <link rel="stylesheet" href="/path/to/style.css" {% csp_nonce_attr %}>
Pour produire les contenus des objets
Mediaavec le nonce appliqué à chacun de ses éléments, passez l’objet à la balisecsp_nonce_attr:{% csp_nonce_attr form.media %}
Changed in Django 6.1:La balise de gabarit
csp_nonce_attra été ajoutée, incluant la prise en charge du rendu des objetsMedia.
Mise en cache et réutilisation de nonce
L’intergiciel ContentSecurityPolicyMiddleware gère automatiquement la génération d’un nonce unique et l’insertion de l’expression source nonce-<valeur> appropriée dans l’en-tête Content-Security-Policy (ou Content-Security-Policy-Report-Only) lorsque le nonce est utilisé dans un gabarit.
Pour garantir un comportement correct, assurez-vous que le code HTML et l’en-tête soient générés par la même requête et non servis à partir du cache. Consultez la documentation de référence sur Utilisation des nonces pour des détails d’implémentation et des considérations importantes concernant le cache.