# Documentation Django 6.0.7

# 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 :

1. Ajoutez l’intergiciel CSP à votre réglage `MIDDLEWARE`:

       MIDDLEWARE = [
           # ...
           "django.middleware.csp.ContentSecurityPolicyMiddleware",
           # ...
       ]

2. Configurez les politiques CSP dans votre fichier `settings.py` en utilisant `SECURE_CSP` ou `SECURE_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 :

1. Inclure la valeur du substituant `NONCE` dans les réglages CSP. Cela ne s’applique qu’aux directives `script-src` ou `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. Ajoutez le processeur de contexte `csp()` à votre réglage `TEMPLATES`. Cela rendra disponible dans les gabarits la valeur nonce générée sous la forme de la variable de contexte `csp_nonce`:

       TEMPLATES = [
           {
               "BACKEND": "django.template.backends.django.DjangoTemplates",
               "OPTIONS": {
                   "context_processors": [
                       # ...
                       "django.template.context_processors.csp",
                   ],
               },
           },
       ]

3. In your templates, add the nonce to elements that require it:

   For inline `<style>` or `<script>` tags, use the `csp_nonce` context variable directly:

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

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

   For external `<script src="...">` and `<link rel="stylesheet">` elements, use the `csp_nonce_attr` template tag:

       <script src="/path/to/script.js" {% csp_nonce_attr %}></script>
       <link rel="stylesheet" href="/path/to/style.css" {% csp_nonce_attr %}>

   To render a `Media` object’s assets with the nonce applied to each element, pass the object to the `csp_nonce_attr` tag:

       {% csp_nonce_attr form.media %}

   Changed in Django 6.1:

   The `csp_nonce_attr` template tag was added, including support for rendering `Media` objects.

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 Nonce usage pour des détails d’implémentation et des considérations importantes concernant le cache.