• 3.2
  • 5.0
  • 6.1
  • Версия документации: 3.1

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

Промежуточное программное обеспечение и декораторы для кликджекинга обеспечивают простую в использовании защиту от «кликджекинга». Этот тип атаки происходит, когда вредоносный сайт обманом заставляет пользователя щелкнуть скрытый элемент другого сайта, который он загрузил в скрытом фрейме или 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'
Changed in Django 3.0:

The default value of the X_FRAME_OPTIONS setting was changed from SAMEORIGIN to 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.")

Примечание

Если вы хотите отправить форму или получить доступ к файлу 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.")

Обратите внимание, что вы можете использовать декораторы вместе с промежуточным программным обеспечением. Использование декоратора переопределяет промежуточное программное обеспечение.

Ограничения

The X-Frame-Options header will only protect against clickjacking in a modern browser. Older browsers will quietly ignore the header and need other clickjacking prevention techniques.

Browsers that support X-Frame-Options

  • Internet Explorer 8+

  • Edge

  • Firefox 3.6.9+

  • Opera 10.5+

  • Safari 4+

  • Chrome 4.1+

See also

A complete list of browsers supporting X-Frame-Options.

Back to Top