Clickjacking middleware och decorators ger ett lättanvänt skydd mot clickjacking. Denna typ av attack inträffar när en skadlig webbplats lurar en användare att klicka på ett dolt element på en annan webbplats som de har laddat i en dold ram eller iframe.
Anta att en webbutik har en sida där en inloggad användare kan klicka på ”Köp nu” för att köpa en vara. En användare har valt att vara inloggad i butiken hela tiden för enkelhetens skull. En angripares webbplats kan skapa en ”Jag gillar ponnyer”-knapp på en av sina egna sidor och ladda butikens sida i en transparent iframe så att ”Köp nu”-knappen osynligt överlagras på ”Jag gillar ponnyer”-knappen. Om användaren besöker angriparens webbplats kommer ett klick på ”I Like Ponies” att leda till ett oavsiktligt klick på ”Köp nu”-knappen och ett omedvetet köp av varan.
Moderna webbläsare respekterar HTTP-huvudet X-Frame-Options som anger om en resurs får laddas i en ram eller iframe eller inte. Om svaret innehåller rubriken med värdet SAMEORIGIN kommer webbläsaren endast att ladda resursen i en ram om begäran kommer från samma webbplats. Om rubriken är inställd på DENY blockerar webbläsaren resursen från att laddas i en ram oavsett vilken webbplats som gjorde begäran.
Django tillhandahåller några sätt att inkludera denna rubrik i svar från din webbplats:
Ett middleware som anger rubriken i alla svar.
En uppsättning vydekoratorer som kan användas för att åsidosätta mellanvaran eller för att bara ställa in rubriken för vissa vyer.
HTTP-rubriken X-Frame-Options kommer endast att ställas in av middleware- eller vydekoratörerna om den inte redan finns i svaret.
X-Frame-Options för alla svar¶För att ställa in samma värde för X-Frame-Options för alla svar på din webbplats, sätt 'django.middleware.clickjacking.XFrameOptionsMiddleware' till MIDDLEWARE:
MIDDLEWARE = [
...,
"django.middleware.clickjacking.XFrameOptionsMiddleware",
...,
]
Denna mellanvara aktiveras i inställningsfilen som genereras av startproject.
Som standard kommer mellanvaran att sätta X-Frame-Options-huvudet till DENY för varje utgående HttpResponse. Om du vill ha något annat värde för detta huvud istället, ange inställningen X_FRAME_OPTIONS:
X_FRAME_OPTIONS = "SAMEORIGIN"
När du använder mellanvaran kan det finnas vissa vyer där du inte vill att X-Frame-Options-huvudet ska ställas in. För dessa fall kan du använda en vydekorator som talar om för mellanvaran att inte ställa in rubriken:
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.")
Observera
Om du vill skicka in ett formulär eller komma åt en sessionscookie inom en ram eller iframe kan du behöva ändra inställningarna CSRF_COOKIE_SAMESITE eller SESSION_COOKIE_SAMESITE.
X-Frame-Options per vy¶För att ställa in rubriken X-Frame-Options per vy tillhandahåller Django dessa dekoratorer:
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.")
Observera att du kan använda dekoratorerna tillsammans med middleware. Användning av en dekorator åsidosätter middleware.
Rubriken X-Frame-Options skyddar endast mot clickjacking i moderna webbläsare.
aug. 11, 2025