Protection contre le détournement de clic (clickjacking)¶
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.
Un exemple de détournement de clic¶
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.
Prévention du détournement de clic¶
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 pour inclure cet en-tête dans les réponses de votre site :
Un intergiciel qui définit l’en-tête dans toutes les réponses.
Un ensemble de décorateurs de vue qui peuvent être utilisés pour remplacer l’intergiciel ou pour ne renseigner l’en-tête que pour certaines vues.
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.
Comment l’utiliser¶
Définition de 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
à DENY
pour chaque réponse HttpResponse
sortante. Si vous préférez une autre valeur pour cet en-tête, définissez le réglage X_FRAME_OPTIONS
:
X_FRAME_OPTIONS = "SAMEORIGIN"
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.")
Note
Si vous avez besoin de soumettre un formulaire ou d’accéder à un cookie de session depuis un cadre (frame ou iframe), il peut être nécessaire de modifier les réglages CSRF_COOKIE_SAMESITE
ou SESSION_COOKIE_SAMESITE
.
La prise en charge de l’enveloppement des fonctions de vue asynchrones a été ajoutée dans le décorateur @xframe_options_exempt
.
Définition de 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.
La prise en charge de l’enveloppement des fonctions de vue asynchrones a été ajoutée dans les décorateurs @xframe_options_deny
et @xframe_options_sameorigin
.
Limitations¶
L’en-tête X-Frame-Options
ne protège contre les détournements de clic que sur les navigateurs modernes.