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

时间:2015-10-21 19:12:01

标签: django iframe http-headers x-frame-options

我正在尝试启用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

4 个答案:

答案 0 :(得分:32)

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

答案 1 :(得分:12)

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

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

答案 2 :(得分:2)

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

  • SAMEORIGIN 将导致许可,如果且仅当请求来自主站点时,才可以将资源加载到框架中。

  • 拒绝将导致阻止以任何类型的框架或iframe加载任何资源的权限,无论请求的来源如何。

Django的点击劫持保护的实现

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

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

为所有响应设置X-Frame-Options

要为您站点中的所有响应设置相同的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

答案 3 :(得分:0)

如果您想在特定视图中允许框架,您可以将 Content-Security-Policy 添加到您的视图响应中,因此您的代码将是这样的

def MyView(request):
    ....
    ....
    response = render(request,'MyViewHtml.html' ,{...})
    response ['Content-Security-Policy'] = "frame-ancestors 'self' https://example.com"