Django的X-Frame-Options设置
1. 事件起因
事件的起因是这样的,我在使用Django服务的时候,想在一个已经存在某个按钮的主页面上,单击这个按钮弹出某个功能页面,设置某些内容,然后再退回到主页面。
我使用了某个插件,在弹出的页面上显示我请求的链接被服务器拒绝。
在使用浏览器调试的console页面中有如下的提示信息:
Refused to display '页面url' in a frame because it set 'X-Frame-Options' to 'deny'.
那么就知道是是X-Frame-Options设置出了问题。
2. 有关X-Frame-Options
2.1 什么是X-Frame-Options
X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面可否在
<frame>
,
</iframe>
或者
<object>
中展现的标记。网站可以使用此功能,来确保自己网站的内容没有被嵌到别人的网站中去,也从而避免了点击劫持 (clickjacking) 的攻击。
2.2 X-Frame-Options选项
X-Frame-Options 有三个值:
-
DENY
:表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许 -
SAMEORIGIN
:表示该页面可以在相同域名页面的 frame 中展示 -
ALLOW-FROM
uri
:表示该页面可以在指定来源的 frame 中展示
换一句话说,如果设置为 DENY,不光在别人的网站 frame 嵌入时会无法加载,在同域名页面中同样会无法加载。
另一方面,如果设置为 SAMEORIGIN,那么页面就可以在同域名页面的 frame 中嵌套。
3.Django有关配置
3.1 Django默认的配置
首先,Django起禁止X-Frame-Options,使用默认设置了相关的配置。
在项目的
setting.py
页面中能够找到如下的设置:
MIDDLEWARE = [
...
'django.middleware.clickjacking.XFrameOptionsMiddleware',
...
]
上面的内容显示,Django的项目中默认设置了
XFrameOptionsMiddleware
的中间件,这个设置将对于
X-Frame-Options
的配置设置成了
DENY
。
在Django 3.0中,
X_FRAME_OPTIONS
的默认设置从
SAMEORIGIN
变成了
DENY
。
3.2 Django总体配置
想要总体设置项目的
X-Frame-Options
可以使用如下的代码:
X_FRAME_OPTIONS = 'SAMEORIGIN'
可以看出上面的是将
X_FRAME_OPTIONS
设置成
SAMEORIGIN
,但是这个改变了整个项目的设置,往往只有某些页面才需要这样的设置,因此下面介绍在单独的页面上设置这些内容。
3.3 指定的网页配置
直接看代码:
from django.http import HttpResponse
from django.views.decorators.clickjacking import xframe_options_exempt
from django.views.decorators.clickjacking import xframe_options_deny
from django.views.decorators.clickjacking import xframe_options_sameorigin
@xframe_options_exempt
def view_one(request):
return HttpResponse("This page is safe to load in a frame on any site.")
@xframe_options_deny
def view_two(request):
return HttpResponse("I won't display in any frame!")
@xframe_options_sameorigin
def view_three(request):
return HttpResponse("Display in a frame if it's from the same origin as me.")
从上面的相应和名称能够很容易看出分别的含义,不在更详细描述。
4. 参考内容
- https://zhidao.baidu.com/question/502193450915313244.html
- https://docs.djangoproject.com/en/3.0/ref/clickjacking/