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 simples pour inclure cet en-tête dans les réponses de votre site :

  1. Un intergiciel simple 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_CLASSES:

MIDDLEWARE_CLASSES = [
    ...
    '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.")

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+
  • 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.

Back to Top