Hur man använder Djangos Content Security Policy

Grundläggande konfiguration

Så här aktiverar du Content Security Policy (CSP) i ditt Django-projekt:

  1. Lägg till CSP-mellanprogramvaran till din MIDDLEWARE-inställning:

    MIDDLEWARE = [
        # ...
        "django.middleware.csp.ContentSecurityPolicyMiddleware",
        # ...
    ]
    
  2. Konfigurera CSP-policyerna i din settings.py med antingen SECURE_CSP eller SECURE_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:

  1. Inkludera platshållarvärdet NONCE i CSP-inställningarna. Detta gäller endast direktiven script-src eller style-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],
    }
    
  2. Lägg till csp()-kontextprocessorn till din TEMPLATES-inställning. Detta gör det genererade nonce-värdet tillgängligt i Django-mallarna som kontextvariabeln csp_nonce:

    TEMPLATES = [
        {
            "BACKEND": "django.template.backends.django.DjangoTemplates",
            "OPTIONS": {
                "context_processors": [
                    # ...
                    "django.template.context_processors.csp",
                ],
            },
        },
    ]
    
  3. I dina mallar lägger du till attributet nonce till relevanta inline-taggarna <style> eller <script> med hjälp av kontextvariabeln csp_nonce:

    <style nonce="{{ csp_nonce }}">
      /* These inline styles will be allowed. */
    </style>
    
    <script nonce="{{ csp_nonce }}">
      // This inline JavaScript will be allowed.
    </script>
    

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 Nonce usage för implementeringsdetaljer och viktiga överväganden kring cachning.