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(...)