Django                
            Безопасность
        
        
            
    Поиск…
Защита от перекрестных ссылок (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" style="font-size: 4000px"><script>alert('hello world!');</script></p>
Если у вас есть переменные, содержащие HTML, которым вы доверяете и на самом деле хотите визуализировать, вы должны прямо сказать, что это безопасно:
<p class="{{ class_name|safe }}">{{ paragraph }}</p>
<!-- Will be rendered as: -->
<p class="large" style="font-size: 4000px"><script>alert('hello world!');</script></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" style="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> <i>world!</i></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(...)