Skydd mot klickjacking¶
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.
Ett exempel på clickjacking¶
Suppose an online store has a page where a logged-in user can click ”Buy Now” to purchase an item. A user has chosen to stay logged into the store all the time for convenience. An attacker site might create an ”I Like Ponies” button on one of their own pages, and load the store’s page in a transparent iframe such that the ”Buy Now” button is invisibly overlaid on the ”I Like Ponies” button. If the user visits the attacker’s site, clicking ”I Like Ponies” will cause an inadvertent click on the ”Buy Now” button and an unknowing purchase of the item.
Förhindra clickjacking¶
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.
Så här använder du den¶
Ställa in 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
.
Ställa in 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.
Begränsningar¶
Rubriken X-Frame-Options
skyddar endast mot clickjacking i moderna webbläsare.