如何在 Django 中配置 X-Frame-Options 以允许 iframe 嵌入一个视图?
Posted
技术标签:
【中文标题】如何在 Django 中配置 X-Frame-Options 以允许 iframe 嵌入一个视图?【英文标题】:How to configure X-Frame-Options in Django to allow iframe embedding of one view? 【发布时间】:2016-01-20 22:14:21 【问题描述】:我正在尝试启用 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
【问题讨论】:
【参考方案1】:如果您想在特定视图中允许框架,您可以将 Content-Security-Policy 添加到您的视图响应中,因此您的代码将是这样的
def MyView(request):
....
....
response = render(request,'MyViewHtml.html' ,...)
response ['Content-Security-Policy'] = "frame-ancestors 'self' https://example.com"
【讨论】:
【参考方案2】:显然,您可以在设置中设置一条规则,告诉以下内容:
X_FRAME_OPTIONS = 'ALLOW-FROM https://example.com/'
现在你也应该考虑迁移到 CSP
Content-Security-Policy: frame-ancestors 'self' example.com *.example.net ;
见https://***.com/a/25617678/186202
【讨论】:
ALLOW-FROM 将不支持 chrome 和 safari 并且 ALLOW-FROM 不应再使用:developer.mozilla.org/en-US/docs/Web/HTTP/Headers/…。正如@Natim 所说:转向 CSP!【参考方案3】:您正朝着正确的方向前进,但实现此目标所需的确切装饰器是“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 不再受支持。现在是升级的好时机。
【讨论】:
我认为,我们需要 iframe 选项 developer.mozilla.org/ru/docs/Web/HTTP/Headers/X-Frame-Options 的 ALLOW-FROM 装饰器来定义可接受的域,而不仅仅是删除 X-Frame Header,请有人创建票证(我无权访问)以上是关于如何在 Django 中配置 X-Frame-Options 以允许 iframe 嵌入一个视图?的主要内容,如果未能解决你的问题,请参考以下文章