Защита от кликджекинга

Промежуточное программное обеспечение и декораторы clickjacking обеспечивают простую в использовании защиту от clickjacking. Этот тип атаки возникает, когда вредоносный сайт обманывает пользователя, заставляя его щелкнуть на скрытом элементе другого сайта, который он загрузил в скрытом фрейме или iframe.

Пример кликджекинга

Предположим, что в интернет-магазине есть страница, на которой вошедший в систему пользователь может нажать кнопку «Купить сейчас», чтобы приобрести товар. Для удобства пользователь решил постоянно оставаться зарегистрированным в магазине. Сайт злоумышленника может создать кнопку «Мне нравятся пони» на одной из своих страниц и загрузить страницу магазина в прозрачном iframe таким образом, чтобы кнопка «Купить сейчас» была незаметно наложена на кнопку «Мне нравятся пони». Если пользователь посетит сайт злоумышленника, нажатие на кнопку «Мне нравятся пони» приведет к непреднамеренному нажатию на кнопку «Купить сейчас» и неосознанной покупке товара.

Предотвращение кликджекинга

Современные браузеры поддерживают HTTP-заголовок X-Frame-Options, который указывает, разрешено ли загружать ресурс во фрейме или iframe. Если ответ содержит заголовок со значением SAMEORIGIN, то браузер будет загружать ресурс во фрейме, только если запрос исходит с того же сайта. Если заголовок имеет значение DENY, то браузер будет блокировать загрузку ресурса во фрейме независимо от того, с какого сайта был сделан запрос.

Django предоставляет несколько способов включить этот заголовок в ответы вашего сайта:

  1. Промежуточное программное обеспечение, которое устанавливает заголовок во всех ответах.
  2. Набор декораторов представления, которые можно использовать для переопределения промежуточного программного обеспечения или для установки заголовка только для определенных представлений.

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.

Установка 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 защитит от кликджекинга только в современном браузере. Более старые браузеры будут спокойно игнорировать этот заголовок и нуждаться в 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.

Вернуться на верх