Защита от кликджекинга
Средство промежуточного ПО для защиты от кликджекинга и декораторы предоставляют удобный способ защиты от кликджекинга. Этот тип атаки происходит, когда вредоносный сайт обманывает пользователя, заставляя его нажать на скрытый элемент другого сайта, который загружен в скрытой рамке или iframe.
Пример кликджекинга
Представьте, что интернет-магазин имеет страницу, на которой авторизованный пользователь может нажать «Купить сейчас», чтобы приобрести товар. Пользователь выбрал, чтобы оставаться авторизованным в магазине для удобства. Вредоносный сайт может создать кнопку «Мне нравятся пони» на одной из своих страниц и загрузить страницу магазина в прозрачном iframe таким образом, чтобы кнопка «Купить сейчас» была невидимо наложена на кнопку «Мне нравятся пони». Если пользователь посетит сайт злоумышленника, нажав «Мне нравятся пони», произойдёт непреднамеренный клик по кнопке «Купить сейчас», и совершится нежелательная покупка товара.
Предотвращение кликджекинга
Современные браузеры поддерживают HTTP-заголовок X-Frame-Options, который указывает, разрешено ли ресурсу загружаться в рамке или iframe. Если ответ содержит заголовок со значением SAMEORIGIN , то браузер будет загружать ресурс в рамку только в том случае, если запрос исходит с того же сайта. Если заголовок установлен в значение DENY , то браузер заблокирует загрузку ресурса в рамку независимо от того, какой сайт сделал запрос.
Django предоставляет несколько способов включить этот заголовок в ответы с вашего сайта:
- Средство промежуточного ПО, которое устанавливает заголовок во всех ответах.
- Набор декораторов представлений, которые могут использоваться для переопределения промежуточного ПО или для установки заголовка только для определённых представлений.
Заголовок 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.")
Примечание
Если вы хотите отправить форму или получить доступ к куки сессии в рамке или iframe, вам может потребоваться изменить настройки CSRF_COOKIE_SAMESITE или SESSION_COOKIE_SAMESITE.
Установка 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+
- Edge
- 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/4.0/ref/clickjacking/