Spec-Zone.ru › Django 6.0

Как использовать политику безопасности содержимого Django

Базовая настройка

Чтобы включить политику безопасности содержимого (CSP) в проекте Django:

  1. Добавьте промежуточное ПО CSP в параметр MIDDLEWARE:

    MIDDLEWARE = [
        # ...
        "django.middleware.csp.ContentSecurityPolicyMiddleware",
        # ...
    ]
    
  2. Настройте политики 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, помимо базовой настройки необходимо:

  1. Добавить значение-заполнитель 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],
    }
    
  2. Добавить контекстный процессор csp() в параметр TEMPLATES. Это сделает сгенерированное значение nonce доступным в шаблонах Django как контекстную переменную csp_nonce:

    TEMPLATES = [
        {
            "BACKEND": "django.template.backends.django.DjangoTemplates",
            "OPTIONS": {
                "context_processors": [
                    # ...
                    "django.template.context_processors.csp",
                ],
            },
        },
    ]
    
  3. В шаблонах добавьте атрибут 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API