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'
La valeur par défaut du réglage X_FRAME_OPTIONS
a été modifiée de SAMEORIGIN
à 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.")
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
.
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.
Limitations¶
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.
Navigateurs qui prennent en charge X-Frame-Options
¶
- Internet Explorer 8+
- Edge
- Firefox 3.6.9+
- Opera 10.5+
- Safari 4+
- Chrome 4.1+
Voir aussi¶
Une liste complète de navigateurs prenant en charge X-Frame-Options
.