为什么xframe_options_exempt对我的Django视图无效?

3 投票
3 回答
2925 浏览
提问于 2025-04-18 09:31

我想让我的页面通过iframe从另一个域名加载,所以按照Django的文档,我在我的视图上加了一个叫@xframe_options_exempt的装饰器。但是当它在iframe中加载时,Chrome还是报错了:

未捕获的安全错误:阻止了来自 "http://www.aaa.com" 的框架访问来自 "http://bbb.com" 的框架。

在开发者工具的网络标签中,我看到响应中没有包含 'X-Frame-options' 这个头信息。

这到底是怎么回事呢?

3 个回答

0

你可能已经知道了,但很遗憾,Django的xframe_options_exempt功能目前只适用于HTTPResponse(截至2021年3月)。

使用它的一个例子是:

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

对于sameorigin和deny的情况,代码会是:

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("Frame won't be displayed!")

@xframe_options_sameorigin
def view_two(request):
    return HttpResponse("Display onlly if from the same origin host.")

参考自 Django的点击劫持保护

1

在你的 settings.py 文件中添加中间件

MIDDLEWARE_CLASSES = (
    ...
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ...
)

然后在你的 views.py 文件中添加需要的导入

from django.http import HttpResponse
from django.views.decorators.clickjacking import xframe_options_exempt
2

我刚遇到过同样的问题。在我的情况下,我抛出了一个 Http404 错误,这似乎会绕过 @xframe_options_exempt 这个装饰器。我怀疑如果你从视图中返回的不是 HttpResponse 对象,那么你的 xframe_options_exempt 装饰器可能不会像你预期的那样工作。

需要注意的是,Http404 这个类,比如说,并没有继承HttpResponse

撰写回答