{"title":"Comment utiliser la politique de sécurité de contenu de Django","version":"6.0","locale":"fr","docname":"howto/csp","url":"/fr/6.0/howto/csp/","canonical":"https://djangodocs.dev/fr/6.0/howto/csp/","summary":"Configuration de base Lien vers cette rubrique # Pour activer la politique de sécurité de contenu (CSP) dans votre projet Django : Ajoutez l’intergiciel CSP à votre…","html":"<h1>Comment utiliser la politique de sécurité de contenu de Django<a class=\"heading-anchor\" href=\"#how-to-use-django-s-content-security-policy\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<section id=\"basic-config\">\n<span id=\"csp-config\"></span><h2>Configuration de base<a class=\"heading-anchor\" href=\"#basic-config\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Pour activer la politique de sécurité de contenu (CSP) dans votre projet Django :</p>\n<ol class=\"arabic\">\n<li><p>Ajoutez l’intergiciel CSP à votre réglage <a class=\"reference internal\" href=\"/fr/6.0/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">MIDDLEWARE</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"s2\">&quot;django.middleware.csp.ContentSecurityPolicyMiddleware&quot;</span><span class=\"p\">,</span>\n    <span class=\"c1\"># ...</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p>Configurez les politiques CSP dans votre fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code> en utilisant <a class=\"reference internal\" href=\"/fr/6.0/ref/settings/#std-setting-SECURE_CSP\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECURE_CSP</span></code></a> ou <a class=\"reference internal\" href=\"/fr/6.0/ref/settings/#std-setting-SECURE_CSP_REPORT_ONLY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECURE_CSP_REPORT_ONLY</span></code></a> (ou les deux). La <a class=\"reference internal\" href=\"/fr/6.0/ref/csp/#csp-settings\"><span class=\"std std-ref\">documentation des réglages CSP</span></a> fournit plus de détails sur les différences entre les deux :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.csp</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">CSP</span>\n\n<span class=\"c1\"># To enforce a CSP policy:</span>\n<span class=\"n\">SECURE_CSP</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default-src&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"n\">CSP</span><span class=\"o\">.</span><span class=\"n\">SELF</span><span class=\"p\">],</span>\n    <span class=\"c1\"># Add more directives to be enforced.</span>\n<span class=\"p\">}</span>\n\n<span class=\"c1\"># Or for report-only mode:</span>\n<span class=\"n\">SECURE_CSP_REPORT_ONLY</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default-src&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"n\">CSP</span><span class=\"o\">.</span><span class=\"n\">SELF</span><span class=\"p\">],</span>\n    <span class=\"c1\"># Add more directives as needed.</span>\n    <span class=\"s2\">&quot;report-uri&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;/path/to/reports-endpoint/&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</li>\n</ol>\n</section>\n<section id=\"nonce-config\">\n<span id=\"csp-nonce-config\"></span><h2>Configuration du nonce<a class=\"heading-anchor\" href=\"#nonce-config\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Pour utiliser des nonces dans votre politique CSP, en plus de la configuration de base, vous devez :</p>\n<ol class=\"arabic\">\n<li><p>Inclure la valeur du substituant <a class=\"reference internal\" href=\"/fr/6.0/ref/csp/#django.utils.csp.CSP.NONCE\" title=\"django.utils.csp.CSP.NONCE\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">NONCE</span></code></a> dans les réglages CSP. Cela ne s’applique qu’aux directives <code class=\"docutils literal notranslate\"><span class=\"pre\">script-src</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">style-src</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.csp</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">CSP</span>\n\n<span class=\"n\">SECURE_CSP</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default-src&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"n\">CSP</span><span class=\"o\">.</span><span class=\"n\">SELF</span><span class=\"p\">],</span>\n    <span class=\"c1\"># Allow self-hosted scripts and script tags with matching `nonce` attr.</span>\n    <span class=\"s2\">&quot;script-src&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"n\">CSP</span><span class=\"o\">.</span><span class=\"n\">SELF</span><span class=\"p\">,</span> <span class=\"n\">CSP</span><span class=\"o\">.</span><span class=\"n\">NONCE</span><span class=\"p\">],</span>\n    <span class=\"c1\"># Example of the less secure &#39;unsafe-inline&#39; option.</span>\n    <span class=\"s2\">&quot;style-src&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"n\">CSP</span><span class=\"o\">.</span><span class=\"n\">SELF</span><span class=\"p\">,</span> <span class=\"n\">CSP</span><span class=\"o\">.</span><span class=\"n\">UNSAFE_INLINE</span><span class=\"p\">],</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</li>\n<li><p>Ajoutez le processeur de contexte <a class=\"reference internal\" href=\"/fr/6.0/ref/templates/api/#django.template.context_processors.csp\" title=\"django.template.context_processors.csp\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">csp()</span></code></a> à votre réglage <a class=\"reference internal\" href=\"/fr/6.0/ref/settings/#std-setting-TEMPLATES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEMPLATES</span></code></a>. Cela rendra disponible dans les gabarits la valeur nonce générée sous la forme de la variable de contexte <code class=\"docutils literal notranslate\"><span class=\"pre\">csp_nonce</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">TEMPLATES</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.template.backends.django.DjangoTemplates&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;context_processors&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span>\n                <span class=\"c1\"># ...</span>\n                <span class=\"s2\">&quot;django.template.context_processors.csp&quot;</span><span class=\"p\">,</span>\n            <span class=\"p\">],</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p>Dans vos gabarits, ajoutez l’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">nonce</span></code> aux balises <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;style&gt;</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;script&gt;</span></code> concernées, en utilisant la variable de contexte <code class=\"docutils literal notranslate\"><span class=\"pre\">csp_nonce</span></code>:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">style</span> <span class=\"na\">nonce</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{{</span> <span class=\"nv\">csp_nonce</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>\n<span class=\"w\">  </span><span class=\"c\">/* These inline styles will be allowed. */</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">style</span><span class=\"p\">&gt;</span>\n\n<span class=\"p\">&lt;</span><span class=\"nt\">script</span> <span class=\"na\">nonce</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{{</span> <span class=\"nv\">csp_nonce</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>\n<span class=\"w\">  </span><span class=\"c1\">// This inline JavaScript will be allowed.</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">script</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n</li>\n</ol>\n<aside class=\"admonition-caching-and-nonce-reuse admonition\">\n<p class=\"admonition-title\">Mise en cache et réutilisation de nonce</p>\n<p>L’intergiciel <a class=\"reference internal\" href=\"/fr/6.0/ref/middleware/#django.middleware.csp.ContentSecurityPolicyMiddleware\" title=\"django.middleware.csp.ContentSecurityPolicyMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentSecurityPolicyMiddleware</span></code></a> gère automatiquement la génération d’un nonce unique et l’insertion de l’expression source <code class=\"docutils literal notranslate\"><span class=\"pre\">nonce-&lt;valeur&gt;</span></code> appropriée dans l’en-tête <code class=\"docutils literal notranslate\"><span class=\"pre\">Content-Security-Policy</span></code> (ou <code class=\"docutils literal notranslate\"><span class=\"pre\">Content-Security-Policy-Report-Only</span></code>) lorsque le nonce est utilisé dans un gabarit.</p>\n<p>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 <a class=\"reference internal\" href=\"/fr/6.0/ref/csp/#csp-nonce\"><span class=\"std std-ref\">Nonce usage</span></a> pour des détails d’implémentation et des considérations importantes concernant le cache.</p>\n</aside>\n</section>","rootId":"how-to-use-django-s-content-security-policy","toc":[{"title":"Configuration de base","anchor":"basic-config","children":[]},{"title":"Configuration du nonce","anchor":"nonce-config","children":[]}],"breadcrumbs":[{"docname":"howto/index","title":"Guides pratiques","url":"/fr/6.0/howto/"}],"prev":{"docname":"howto/auth-remote-user","title":"Comment authentifier avec REMOTE_USER","url":"/fr/6.0/howto/auth-remote-user/"},"next":{"docname":"howto/csrf","title":"Comment utiliser la protection CSRF de Django","url":"/fr/6.0/howto/csrf/"},"formats":{"html":"/fr/6.0/howto/csp/","markdown":"/fr/6.0/howto/csp.md","json":"/fr/6.0/howto/csp.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/howto/csp.txt","official":"https://docs.djangoproject.com/fr/6.0/howto/csp/","inVersions":["6.1","6.0"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}