Spec-Zone.ru › Django 5.0

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

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

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

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

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

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

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

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

Заголовок 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.

Изменено в Django 5.0:

Добавлена поддержка обертывания асинхронных функций представления в декоратор @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.")

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

Изменено в Django 5.0:

Добавлена поддержка обертывания асинхронных функций представления в декораторы @xframe_options_deny и @xframe_options_sameorigin.

Ограничения

Заголовок 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/5.0/ref/clickjacking/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API