Spec-Zone.ru › Django 6.0

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

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

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/6.0/ref/clickjacking/

Spec-Zone.ru

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