L’intergiciel et les décorateurs de protection contre le détournement de clic fournissent une protection facile à utiliser contre le « clickjacking ». Ce type d’attaque se produit lorsqu’un site malveillant piège un utilisateur pour qu’il clique sur un élément caché d’un autre site que le site malveillant a chargé dans un cadre caché ou dans un iframe.
Supposons qu’une boutique en ligne dispose d’une page où un utilisateur connecté peut cliquer sur « Acheter » pour acheter un article. Un utilisateur a choisi de rester connecté dans le magasin en permanence pour des raisons pratiques. Un site attaquant peut créer un bouton « J’aime les poneys » sur une de ses propres pages, et charger la page de la boutique dans un cadre iframe transparent de façon à ce que le bouton « Acheter » soit superposé et invisible au-dessus du bouton « J’aime les poneys ». Si l’utilisateur visite le site de l’attaquant, un clic sur « J’aime les poneys », va engendrer un clic inopiné sur le bouton « Acheter » de la boutique en ligne et l’article va être acheté sans que l’utilisateur ne le sache.
Les navigateurs modernes honorent l’en-tête HTTP X-Frame-Options qui indique si une ressource est autorisée à être chargée dans un cadre ou un iframe. Si la réponse contient dans cet en-tête une valeur SAMEORIGIN
, le navigateur ne chargera la ressource dans un cadre que si la demande provient du même site. Si l’en-tête contient DENY
, le navigateur bloque alors le chargement de la ressource dans un cadre quel que soit le site qui en fait la demande.
Django fournit quelques moyens simples pour inclure cet en-tête dans les réponses de votre site :
L’en-tête HTTP X-Frame-Options
ne sera défini par l’intergiciel ou les décorateurs de vue que s’il n’est pas déjà présent dans la réponse.
X-Frame-Options
pour toutes les réponses¶Pour définir la même valeur X-Frame-Options
pour toutes les réponses de votre site, ajoutez 'django.middleware.clickjacking.XFrameOptionsMiddleware'
dans le réglage MIDDLEWARE
:
MIDDLEWARE = [
...
'django.middleware.clickjacking.XFrameOptionsMiddleware',
...
]
Cet intergiciel est activé dans le fichier des réglages généré par startproject
.
Par défaut, l’intergiciel définit l’en-tête X-Frame-Options
à SAMEORIGIN
pour chaque réponse HttpResponse
sortante. Si vous préférez la valeur DENY
, définissez le réglage X_FRAME_OPTIONS
:
X_FRAME_OPTIONS = 'DENY'
Lors de l’utilisation de l’intergiciel, il peut y avoir des vues pour lesquelles vous ne souhaitez pas définir l’en-tête X-Frame-Options
. Pour ces cas-là, vous pouvez utiliser un décorateur de vue qui indique à l’intergiciel de ne pas définir l’en-tête :
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.")
X-Frame-Options
par vue¶Pour définir l’en-tête X-Frame-Options
vue par vue, Django fournit ces décorateurs :
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.")
Notez que vous pouvez utiliser les décorateurs en plus de l’intergiciel. L’utilisation d’un décorateur remplace le comportement de l’intergiciel.
L’en-tête X-Frame-Options
protège uniquement des détournements de clic dans les navigateurs modernes. Les anciens navigateurs ignorent silencieusement cet en-tête et ont besoin d”autres techniques de prévention du détournement de clic.
X-Frame-Options
¶Une liste complète de navigateurs prenant en charge X-Frame-Options
.
déc. 02, 2017