Как использовать политику безопасности содержимого Django
Базовая настройка
Чтобы включить политику безопасности содержимого (CSP) в проекте Django:
-
Добавьте промежуточное ПО CSP в параметр
MIDDLEWARE:MIDDLEWARE = [ # ... "django.middleware.csp.ContentSecurityPolicyMiddleware", # ... ] -
Настройте политики CSP в
settings.py, используяSECURE_CSPилиSECURE_CSP_REPORT_ONLY(или оба параметра). В документации по настройкам CSP подробнее описаны различия между ними: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
Чтобы использовать nonce в политике CSP, помимо базовой настройки необходимо:
-
Добавить значение-заполнитель
NONCEв настройки CSP. Это применимо только к директивамscript-srcили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], } -
Добавить контекстный процессор
csp()в параметрTEMPLATES. Это сделает сгенерированное значение nonce доступным в шаблонах Django как контекстную переменнуюcsp_nonce:TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "OPTIONS": { "context_processors": [ # ... "django.template.context_processors.csp", ], }, }, ] -
В шаблонах добавьте атрибут
nonceк соответствующим встроенным тегам<style>или<script>, используя контекстную переменнуюcsp_nonce:<style nonce="{{ csp_nonce }}"> /* These inline styles will be allowed. */ </style> <script nonce="{{ csp_nonce }}"> // This inline JavaScript will be allowed. </script>
Кэширование и повторное использование nonce
ContentSecurityPolicyMiddleware автоматически генерирует уникальный nonce и добавляет соответствующее выражение источника nonce-<value> в заголовок Content-Security-Policy (или Content-Security-Policy-Report-Only), если nonce используется в шаблоне.
Чтобы обеспечить корректную работу, убедитесь, что HTML и заголовок формируются в рамках одного запроса и не отдаются из кэша. Сведения о реализации и важных аспектах кэширования см. в справочной документации в разделе Использование nonce.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/6.0/howto/csp/