---
title: "Protection contre le détournement de clic (clickjacking)"
version: 6.1
locale: fr
source: https://docs.djangoproject.com/fr/6.1/ref/clickjacking/
canonical: https://djangodocs.dev/fr/6.1/ref/clickjacking/
---
# 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](https://en.wikipedia.org/wiki/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](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/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 :

1. Un intergiciel qui définit l’en-tête dans toutes les réponses.
2. 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`](/fr/6.1/ref/settings/#std-setting-MIDDLEWARE):

```
MIDDLEWARE = [
    ...,
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
    ...,
]
```

Cet intergiciel est activé dans le fichier des réglages généré par [`startproject`](/fr/6.1/ref/django-admin/#django-admin-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`](/fr/6.1/ref/settings/#std-setting-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`](/fr/6.1/ref/settings/#std-setting-CSRF_COOKIE_SAMESITE) ou [`SESSION_COOKIE_SAMESITE`](/fr/6.1/ref/settings/#std-setting-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` ne protège contre les détournements de clic que sur les [navigateurs modernes](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options#browser_compatibility).
