Hur man använder Djangos Content Security Policy¶
Grundläggande konfiguration¶
Så här aktiverar du Content Security Policy (CSP) i ditt Django-projekt:
Lägg till CSP-mellanprogramvaran till din
MIDDLEWARE-inställning:MIDDLEWARE = [ # ... "django.middleware.csp.ContentSecurityPolicyMiddleware", # ... ]
Konfigurera CSP-policyerna i din
settings.pymed antingenSECURE_CSPellerSECURE_CSP_REPORT_ONLY(eller båda). CSP-inställningsdokumentationen ger mer information om skillnaderna mellan dessa två: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/", }
Nonce-konfiguration¶
För att använda nonces i din CSP-policy måste du, förutom den grundläggande konfigurationen, göra följande:
Inkludera platshållarvärdet
NONCEi CSP-inställningarna. Detta gäller endast direktivenscript-srcellerstyle-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], }
Lägg till
csp()-kontextprocessorn till dinTEMPLATES-inställning. Detta gör det genererade nonce-värdet tillgängligt i Django-mallarna som kontextvariabelncsp_nonce:TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "OPTIONS": { "context_processors": [ # ... "django.template.context_processors.csp", ], }, }, ]
Lägg till nonce-värdet i de element som behöver det i dina mallar:
För infogade taggarna
<style>och<script>använder du kontextvariabelncsp_noncedirekt:<style nonce="{{ csp_nonce }}"> /* These inline styles will be allowed. */ </style> <script nonce="{{ csp_nonce }}"> // This inline JavaScript will be allowed. </script>
För externa elementen
<script src="...">och<link rel="stylesheet">använder du malltaggencsp_nonce_attr:<script src="/path/to/script.js" {% csp_nonce_attr %}></script> <link rel="stylesheet" href="/path/to/style.css" {% csp_nonce_attr %}>
För att återge tillgångarna för ett
Media-objekt med nonce-värdet tillämpat på varje element skickar du objektet till taggencsp_nonce_attr:{% csp_nonce_attr form.media %}
Changed in Django 6.1:Malltaggen
csp_nonce_attrlades till, med stöd för att återgeMedia-objekt.
Cachning och återanvändning av nonce
ContentSecurityPolicyMiddleware hanterar automatiskt genereringen av en unik nonce och infogar lämpligt nonce-<value>-källuttryck i Content-Security-Policy- (eller Content-Security-Policy-Report-Only-) rubriken när noncen används i en mall.
För att säkerställa korrekt funktion, se till att både HTML-koden och rubriken genereras inom samma begäran och inte hämtas från cacheminnet. Se referensdokumentationen om Användning av nonce för implementeringsdetaljer och viktiga överväganden kring cachning.