如何在Django中配置X-Frame-Options以允许iframe嵌入一个视图?

问题描述 投票:15回答:3

我正在尝试启用django以允许将一个特定视图嵌入到外部站点上,优先考虑没有站点限制。

在我的views.py文件中,我添加了以下代码,其中视图futurebig是我想要嵌入的那个:

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)

这根本无法理解,因为它只能在同一台服务器中嵌入。

如何设置特定视图的标题以使其嵌入任何网站?

为了记录,我只是一个前端开发人员,开发该网站的后端开发人员不再与我合作并拒绝记录他的代码,因此,如果有人可以帮助我并仔细解释我应该在哪里做什么修改,我会非常感激。

谢谢。

据我所知,Django版本是1.6

django iframe http-headers x-frame-options
3个回答
33
投票

你正朝着正确的方向前进,但你需要实现的精确装饰是'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。现在是升级的好时机。


13
投票

显然,您可以在设置中设置一条规则,说明如下:

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

现在你也应该考虑转向CSP

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

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


4
投票

最新的Internet浏览器具有内置的HTTP标头系统X-Frame-Options,可以将其视为允许您在框架或iframe中加载资源的设置。标头有两个值:

  • 当且仅当请求来自主站点时,SAMEORIGIN才会获得在帧中加载资源的权限。
  • DENY将导致阻止加载任何类型的框架或iframe中的任何资源的权限,无论请求来源如何。

Django’s Implementation of Clickjacking Protection

  1. 一个简单的中间件,用于在所有响应中设置标头。
  2. 一组视图装饰器,可用于覆盖中间件或仅为某些视图设置标头。

如果响应中尚未存在X-Frame-Options HTTP标头,则只能由中间件或视图装饰器设置。

Setting X-Frame-Options for all Responses

要为站点中的所有响应设置相同的X-Frame-Options值,请将django.middleware.clickjacking.XFrameOptionsMiddleware放入MIDDLEWARE

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

上面显示的middleware将为每个SAMEORIGIN将X-Frame-Options标题值设置为HttpResponse。如果您的要求是要使用DENY代替它,您始终可以将此设置设置为所需的值。

X_FRAME_OPTIONS = 'DENY'

您可能需要某些视图,而不希望设置X-Frame-Options标头值。对于这种情况,Django提供了视图装饰器,指示中间件不设置标头。

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@xframe_options_sameorigin是Django提供的除@xframe_options_exempt之外的其他装饰器,用于在选择视图的基础上设置X-Frame-Options标头。

Source

© www.soinside.com 2019 - 2024. All rights reserved.