web-dev-qa-db-fra.com

Comment configurer X-Frame-Options dans Django pour permettre l'incorporation d'iframe d'une vue?

J'essaie d'activer Django pour permettre à une vue spécifique d'être incorporée sur des sites externes, de préférence sans restrictions de sites.

Dans mon fichier views.py, j'ai ajouté le code suivant, où la vue futurebig est celle que je souhaite activer pour être incorporée:

from Django.views.decorators.clickjacking import xframe_options_sameorigin
...
@xframe_options_sameorigin
def futurebig(request):
    ...
    return render_to_response('templates/iframe/future_clock_big.html', context_dict, context)

ce qui n'aide pas si je comprends bien, car il permet uniquement l'intégration dans le même serveur.

Comment puis-je définir les en-têtes de cette vue spécifique pour permettre son intégration dans n'importe quel site Web?

Pour mémoire, je ne suis qu'un développeur frontend, le développeur backend qui a développé le site ne travaille plus avec moi et a refusé de documenter son code, donc, si quelqu'un pouvait m'aider et expliquer soigneusement où et quelles modifications je devais faire, Je l'apprécierai beaucoup.

Merci.

Pour autant que je sache, la version Django est 1.6

27
user1230041

Vous allez dans la bonne direction, mais le décorateur exact dont vous aurez besoin pour y parvenir est 'xframe_options_exempt'.

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.")

PS: Django 1.6 n'est plus supporté. Il est temps d'obtenir une mise à jour.

46
iankit

Apparemment, vous pouvez définir une règle dans vos paramètres indiquant ce qui suit:

X_FRAME_OPTIONS = 'ALLOW-FROM https://example.com/'

De nos jours, vous devriez également envisager de passer au CSP

Content-Security-Policy: frame-ancestors 'self' example.com *.example.net ;

Voir https://stackoverflow.com/a/25617678/186202

17
Natim

Les derniers navigateurs Internet ont un système intégré de l'en-tête HTTP, X-Frame-Options, qui peut être considéré comme un paramètre qui vous permet d'autoriser le chargement des ressources dans un cadre ou une iframe. L'en-tête prend deux valeurs:

  • [~ # ~] même origine [~ # ~] entraînera l'autorisation de charger la ressource dans un cadre, si et seulement si la demande provient de la site principal.

  • [~ # ~] nier [~ # ~] entraînera le blocage de l'autorisation de charger n'importe quelle ressource dans n'importe quel type de trame ou iframe, quel que soit le demande d'origine.

Mise en œuvre par Django de la protection contre le détournement de clics

  1. Un middleware simple qui définit l'en-tête dans toutes les réponses.
  2. Un ensemble de décorateurs de vue qui peut être utilisé pour remplacer le middleware ou pour définir uniquement l'en-tête pour certaines vues.

L'en-tête HTTP X-Frame-Options ne sera défini par le middleware ou les décorateurs de vue que s'il n'est pas déjà présent dans la réponse.

Définition des options de trame X pour toutes les réponses

Pour définir la même valeur X-Frame-Options pour toutes les réponses de votre site, mettez Django.middleware.clickjacking.XFrameOptionsMiddleware à MIDDLEWARE:

MIDDLEWARE = [
    ...
    'Django.middleware.clickjacking.XFrameOptionsMiddleware',
    ...
]

Le middleware affiché ci-dessus définira la valeur d'en-tête X-Frame-Options sur SAMEORIGIN pour chaque HttpResponse. Si vos besoins sont tels que vous souhaitez utiliser DENY à la place de cela, vous pouvez toujours définir ce paramètre à la valeur souhaitée.

X_FRAME_OPTIONS = 'DENY'

Il peut y avoir des exigences où vous voulez des vues où vous ne voulez pas que la valeur d'en-tête X-Frame-Options soit définie. Dans de tels cas, Django propose des décorateurs de vue qui demandent au middleware 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 let_load_in_an_iframe(request):

    return HttpResponse("This page is safe to load in an iframe on any site.")

@xframe_options_deny et @xframe_options_sameorigin sont d'autres décorateurs que Django fournit à part @xframe_options_exempt, pour définir l'en-tête X-Frame-Options sur une base de vue sélective.

Source

3
Alex Jolig