Защита от кликджекинга¶
Промежуточное программное обеспечение и декораторы clickjacking обеспечивают простую в использовании защиту от clickjacking. Этот тип атаки возникает, когда вредоносный сайт обманывает пользователя, заставляя его щелкнуть на скрытом элементе другого сайта, который он загрузил в скрытом фрейме или iframe.
Пример кликджекинга¶
Предположим, что в интернет-магазине есть страница, на которой вошедший в систему пользователь может нажать кнопку «Купить сейчас», чтобы приобрести товар. Для удобства пользователь решил постоянно оставаться зарегистрированным в магазине. Сайт злоумышленника может создать кнопку «Мне нравятся пони» на одной из своих страниц и загрузить страницу магазина в прозрачном iframe таким образом, чтобы кнопка «Купить сейчас» была незаметно наложена на кнопку «Мне нравятся пони». Если пользователь посетит сайт злоумышленника, нажатие на кнопку «Мне нравятся пони» приведет к непреднамеренному нажатию на кнопку «Купить сейчас» и неосознанной покупке товара.
Предотвращение кликджекинга¶
Современные браузеры поддерживают HTTP-заголовок X-Frame-Options, который указывает, разрешено ли загружать ресурс во фрейме или iframe. Если ответ содержит заголовок со значением SAMEORIGIN
, то браузер будет загружать ресурс во фрейме, только если запрос исходит с того же сайта. Если заголовок имеет значение DENY
, то браузер будет блокировать загрузку ресурса во фрейме независимо от того, с какого сайта был сделан запрос.
Django предоставляет несколько способов включить этот заголовок в ответы вашего сайта:
- Промежуточное программное обеспечение, которое устанавливает заголовок во всех ответах.
- Набор декораторов представления, которые можно использовать для переопределения промежуточного программного обеспечения или для установки заголовка только для определенных представлений.
HTTP-заголовок X-Frame-Options
будет установлен промежуточным ПО или декораторами представления, только если он еще не присутствует в ответе.
Как его использовать¶
Установка X-Frame-Options
для всех ответов¶
Чтобы установить одинаковое значение X-Frame-Options
для всех ответов на вашем сайте, поставьте 'django.middleware.clickjacking.XFrameOptionsMiddleware'
на MIDDLEWARE
:
MIDDLEWARE = [
...,
"django.middleware.clickjacking.XFrameOptionsMiddleware",
...,
]
Это промежуточное ПО включается в файле настроек, создаваемом startproject
.
По умолчанию промежуточное ПО будет устанавливать для заголовка X-Frame-Options
значение DENY
для каждого исходящего HttpResponse
. Если вы хотите получить любое другое значение для этого заголовка, установите параметр X_FRAME_OPTIONS
:
X_FRAME_OPTIONS = "SAMEORIGIN"
При использовании промежуточного ПО могут возникнуть представления, в которых вы не хотите устанавливать заголовок X-Frame-Options
. Для этих случаев можно использовать декоратор представления, который указывает промежуточному ПО не устанавливать заголовок:
from django.http import HttpResponse
from django.views.decorators.clickjacking import xframe_options_exempt
@xframe_options_exempt
def ok_to_load_in_a_frame(request):
return HttpResponse("This page is safe to load in a frame on any site.")
Примечание
Если вы хотите отправить форму или получить доступ к сессионному cookie во фрейме или iframe, вам может понадобиться изменить настройки CSRF_COOKIE_SAMESITE
или SESSION_COOKIE_SAMESITE
.
В декоратор @xframe_options_exempt
добавлена поддержка обертывания асинхронных функций представления.
Установка X-Frame-Options
за просмотр¶
Чтобы установить заголовок X-Frame-Options
на основе каждого представления, Django предоставляет эти декораторы:
from django.http import HttpResponse
from django.views.decorators.clickjacking import xframe_options_deny
from django.views.decorators.clickjacking import xframe_options_sameorigin
@xframe_options_deny
def view_one(request):
return HttpResponse("I won't display in any frame!")
@xframe_options_sameorigin
def view_two(request):
return HttpResponse("Display in a frame if it's from the same origin as me.")
Обратите внимание, что декораторы можно использовать вместе с промежуточным программным обеспечением. Использование декоратора переопределяет промежуточное ПО.
В декораторы @xframe_options_deny
и @xframe_options_sameorigin
была добавлена поддержка обертывания асинхронных функций представления.
Ограничения¶
Заголовок X-Frame-Options
защитит от кликджекинга только в современном браузере. Более старые браузеры будут спокойно игнорировать этот заголовок и нуждаться в other clickjacking prevention techniques.
Браузеры, поддерживающие X-Frame-Options
¶
- Internet Explorer 8+
- Край
- Firefox 3.6.9+
- Opera 10.5+
- Сафари 4+
- Chrome 4.1+
См. также¶
complete list браузеров, поддерживающих X-Frame-Options
.