Защита от кликджекинга
Средства мидлвеара и декораторы для защиты от кликджекинга предоставляют удобный способ защиты. Этот тип атаки происходит, когда вредоносный сайт обманывает пользователя, заставляя его нажать на скрытый элемент другого сайта, загруженного в скрытой рамке или iframe.
Пример кликджекинга
Предположим, у интернет-магазина есть страница, где авторизованный пользователь может нажать «Купить сейчас», чтобы приобрести товар. Пользователь решил оставаться авторизованным для удобства. Вредоносный сайт может создать кнопку «Мне нравятся пони» на одной из своих страниц и загрузить страницу магазина в прозрачный iframe так, чтобы кнопка «Купить сейчас» была невидимо наложена на кнопку «Мне нравятся пони». Если пользователь посетит сайт злоумышленника, нажав «Мне нравятся пони», произойдёт непреднамеренный клик на кнопку «Купить сейчас», и будет совершена нежелательная покупка.
Предотвращение кликджекинга
Современные браузеры поддерживают HTTP-заголовок X-Frame-Options, который указывает, разрешено ли загружать ресурс в рамке или iframe. Если ответ содержит заголовок со значением SAMEORIGIN , браузер будет загружать ресурс в рамку только в том случае, если запрос исходил с того же сайта. Если заголовок установлен в значение DENY , браузер заблокирует загрузку ресурса в рамке, независимо от того, какой сайт сделал запрос.
Django предоставляет несколько простых способов включить этот заголовок в ответы с вашего сайта:
- Простой миддлвеар, устанавливающий заголовок во всех ответах.
- Набор декораторов представлений, которые можно использовать для переопределения миддлвеара или установки заголовка только для определённых представлений.
Заголовок X-Frame-Options будет установлен миддлвеаром или декораторами представлений только в том случае, если он еще не присутствует в ответе.
Как использовать
Установка X-Frame-Options для всех ответов
Чтобы установить одинаковое значение X-Frame-Options для всех ответов на вашем сайте, поместите 'django.middleware.clickjacking.XFrameOptionsMiddleware' в MIDDLEWARE_CLASSES:
MIDDLEWARE_CLASSES = [
...
'django.middleware.clickjacking.XFrameOptionsMiddleware',
...
]
Этот миддлвеар включён в файле настроек, сгенерированном startproject.
По умолчанию миддлвеар установит заголовок X-Frame-Options в значение SAMEORIGIN для каждого исходящего HttpResponse. Если вам нужен DENY вместо этого, установите настройку X_FRAME_OPTIONS:
X_FRAME_OPTIONS = 'DENY'
При использовании миддлвеара могут быть некоторые представления, где вы не хотите устанавливать заголовок 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.")
Установка 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.")
Обратите внимание, что вы можете использовать декораторы совместно с миддлвеаром. Использование декоратора переопределяет миддлвеар.
Ограничения
Заголовок X-Frame-Options защитит от кликджекинга только в современных браузерах. Более старые браузеры игнорируют заголовок и требуют других методов защиты от кликджекинга.
Браузеры, поддерживающие X-Frame-Options
- Internet Explorer 8+
- Firefox 3.6.9+
- Opera 10.5+
- Safari 4+
- Chrome 4.1+
См. также
Полный список браузеров, поддерживающих X-Frame-Options.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.9/ref/clickjacking/