Поиск…


Защита от перекрестных ссылок (XSS)

Атаки XSS состоят в том, чтобы вводить HTML (или JS) код на странице. Дополнительные сведения см. В разделе « Межсайтовый скриптинг» .

Чтобы предотвратить эту атаку, по умолчанию Django избегает строк, прошедших через переменную шаблона.

Учитывая следующий контекст:

context = {
    'class_name': 'large" style="font-size:4000px',
    'paragraph': (
        "<script type=\"text/javascript\">alert('hello world!');</script>"),
}
<p class="{{ class_name }}">{{ paragraph }}</p>
<!-- Will be rendered as: -->
<p class="large&quot; style=&quot;font-size: 4000px">&lt;script&gt;alert(&#39;hello world!&#39;);&lt;/script&gt;</p>

Если у вас есть переменные, содержащие HTML, которым вы доверяете и на самом деле хотите визуализировать, вы должны прямо сказать, что это безопасно:

<p class="{{ class_name|safe }}">{{ paragraph }}</p>
<!-- Will be rendered as: -->
<p class="large" style="font-size: 4000px">&lt;script&gt;alert(&#39;hello world!&#39;);&lt;/script&gt;</p>

Если у вас есть блок, содержащий несколько переменных, которые являются безопасными, вы можете локально отключить автоматическое экранирование:

{% autoescape off %}
<p class="{{ class_name }}">{{ paragraph }}</p>
{% endautoescape %}
<!-- Will be rendered as: -->
<p class="large" style="font-size: 4000px"><script>alert('hello world!');</script></p>

Вы также можете пометить строку как безопасную вне шаблона:

from django.utils.safestring import mark_safe

context = {
    'class_name': 'large" style="font-size:4000px',
    'paragraph': mark_safe(
        "<script type=\"text/javascript\">alert('hello world!');</script>"),
}
<p class="{{ class_name }}">{{ paragraph }}</p>
<!-- Will be rendered as: -->
<p class="large&quot; style=&quot;font-size: 4000px"><script>alert('hello world!');</script></p>

Некоторые утилиты Django, такие как format_html уже возвращают строки, помеченные как безопасные:

from django.utils.html import format_html

context = {
    'var': format_html('<b>{}</b> {}', 'hello', '<i>world!</i>'),
}
<p>{{ var }}</p>
<!-- Will be rendered as -->
<p><b>hello</b> &lt;i&gt;world!&lt;/i&gt;</p>

Защита от перегрузки

Clickjacking - это вредоносная техника обмана веб-пользователя, нажатие на что-то отличное от того, что пользователь видит, на который они нажимают. Учить больше

Чтобы включить защиту от XFrameOptionsMiddleware , добавьте XFrameOptionsMiddleware в свои классы промежуточного программного обеспечения. Это уже должно быть, если вы не удалили его.

# settings.py
MIDDLEWARE_CLASSES = [
    ...
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ...
]

Это промежуточное программное обеспечение устанавливает заголовок «X-Frame-Options» для всех ваших ответов, если явно не освобождено или уже установлено (не переопределено, если оно уже установлено в ответе). По умолчанию установлено значение «SAMEORIGIN». Чтобы изменить это, используйте настройку X_FRAME_OPTIONS :

X_FRAME_OPTIONS = 'DENY'

Вы можете переопределить поведение по умолчанию для каждого представления.

from django.utils.decorators import method_decorator
from django.views.decorators.clickjacking import (
    xframe_options_exempt, xframe_options_deny, xframe_options_sameorigin,
)

xframe_options_exempt_m = method_decorator(xframe_options_exempt, name='dispatch')

@xframe_options_sameorigin
def my_view(request, *args, **kwargs):
    """Forces 'X-Frame-Options: SAMEORIGIN'."""
    return HttpResponse(...)

@method_decorator(xframe_options_deny, name='dispatch')
class MyView(View):
    """Forces 'X-Frame-Options: DENY'."""

@xframe_options_exempt_m
class MyView(View):
    """Does not set 'X-Frame-Options' header when passing through the
    XFrameOptionsMiddleware.
    """

Защита от перекрестных ссылок (CSRF)

Подделка запросов на межсайтовый запрос, также известный как атака одним нажатием или сеансом верховой езды и сокращенная как CSRF или XSRF, является видом вредоносного использования веб-сайта, на котором неавторизованные команды передаются от пользователя, которому доверяет веб-сайт. Учить больше

Чтобы включить защиту CSRF, добавьте CsrfViewMiddleware в классы промежуточного программного обеспечения. Это промежуточное ПО включено по умолчанию.

# settings.py
MIDDLEWARE_CLASSES = [
    ...
    'django.middleware.csrf.CsrfViewMiddleware',
    ...
]

Это промежуточное программное обеспечение будет устанавливать маркер в cookie исходящего ответа. Всякий раз, когда входящий запрос использует небезопасный метод (любой метод, кроме GET , HEAD , OPTIONS и TRACE ), cookie должен соответствовать csrfmiddlewaretoken который отправляется как csrfmiddlewaretoken формы csrfmiddlewaretoken или как заголовок X-CsrfToken . Это гарантирует, что клиент, инициирующий запрос, также является владельцем файла cookie и, как правило, сеансом (аутентифицированным).

Если запрос выполняется через HTTPS , включена строгая проверка ссылок. Если заголовок HTTP_REFERER не соответствует хосту текущего запроса или хоста в CSRF_TRUSTED_ORIGINS ( новый в CSRF_TRUSTED_ORIGINS 1.9 ), запрос CSRF_TRUSTED_ORIGINS .

Формы, использующие метод POST должны включать токен CSRF в шаблоне. {% csrf_token %} шаблона {% csrf_token %} выведет скрытое поле и будет гарантировать, что cookie будет установлен в ответ:

<form method='POST'>
{% csrf_token %}
...
</form>

Отдельные представления, которые не уязвимы для атак CSRF, могут быть освобождены с @csrf_exempt декоратора @csrf_exempt :

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def my_view(request, *args, **kwargs):
    """Allows unsafe methods without CSRF protection"""
    return HttpResponse(...)

Хотя это и не рекомендуется, вы можете отключить CsrfViewMiddleware если многие ваши взгляды не уязвимы для атак CSRF. В этом случае вы можете использовать декоратор @csrf_protect для защиты отдельных видов:

from django.views.decorators.csrf import csrf_protect

@csrf_protect
def my_view(request, *args, **kwargs):
    """This view is protected against CSRF attacks if the middleware is disabled"""
    return HttpResponse(...)


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow