El middleware y decoradores de clickjacking proporcionan protección fácil de usar contra clickjacking. Este tipo de ataque ocurre cuando un sitio malicioso engaña a un usuario para que haga clic en un elemento oculto de otro sitio que ha cargado en una ventana o iframe oculta.
Supongamos que una tienda en línea tiene una página donde un usuario conectado puede hacer clic en «Comprar ahora» para comprar un artículo. Un usuario ha elegido permanecer conectado a la tienda todo el tiempo por conveniencia. Un sitio atacante podría crear un botón «Me gustan los ponies» en una de sus propias páginas y cargar la página de la tienda en un iframe transparente, de modo que el botón «Comprar ahora» esté invisiblemente superpuesto al botón «Me gustan los ponies». Si el usuario visita el sitio del atacante, hacer clic en «Me gustan los ponies» causará un clic inadvertido en el botón «Comprar ahora» y una compra desconocida del artículo.
Los navegadores modernos respetan el encabezado HTTP X-Frame-Options que indica si se permite o no cargar un recurso dentro de un marco o iframe. Si la respuesta contiene el encabezado con un valor de SAMEORIGIN entonces el navegador solo cargará el recurso en un marco si la solicitud provino del mismo sitio. Si el encabezado está configurado para DENY entonces el navegador bloqueará el recurso de cargar en un marco, independientemente de cuál sea el sitio que realizó la solicitud.
Django proporciona varias formas de incluir este encabezado en las respuestas de su sitio:
Un middleware que establece el encabezado en todas las respuestas.
Un conjunto de decoradores de vistas que se pueden utilizar para sobrescribir el middleware o solo establecer el encabezado para ciertas vistas.
El encabezado X-Frame-Options HTTP solo se establecerá por el middleware o los decoradores de vista si no está presente ya en la respuesta.
X-Frame-Options para todas las respuestas¶Para establecer el mismo valor X-Frame-Options para todas las respuestas de su sitio, agregue “django.middleware.clickjacking.XFrameOptionsMiddleware” a MIDDLEWARE:
MIDDLEWARE = [
...,
"django.middleware.clickjacking.XFrameOptionsMiddleware",
...,
]
Este middleware se habilita en el archivo de configuración generado por startproject.
Por defecto, el middleware establecerá la cabecera X-Frame-Options a DENY para cada respuesta HttpResponse. Si deseas cualquier otro valor para esta cabecera en lugar de eso, configura la configuración X_FRAME_OPTIONS:
X_FRAME_OPTIONS = "SAMEORIGIN"
Al utilizar el middleware puede haber algunas vistas donde no quieras que se establezca la cabecera X-Frame-Options. Para esos casos, puedes usar un decorador de vista que le diga al middleware que no establezca la cabecera:
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.")
Nota
Si deseas enviar un formulario o acceder a una cookie de sesión dentro de un marco o iframe, es posible que debas modificar las configuraciones CSRF_COOKIE_SAMESITE o SESSION_COOKIE_SAMESITE.
X-Frame-Options por vista¶Para establecer la cabecera X-Frame-Options en una base de vistas, Django proporciona estos decoradores:
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.")
Nota que puedes usar los decoradores conjuntamente con el middleware. El uso de un decorador anula al middleware.
La cabecera X-Frame-Options solo protegerá contra clickjacking en navegadores modernos.
may 31, 2026