# Documentation Django 6.0.7

# 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 :

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`:

    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`.

### 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.