Django3.0开发“'X-Frame-Options' to 'deny'”报错
一、起因
在使用Django3.0开发博客的过程中出现报错
Refused to display 'URL' in a frame because it set 'X-Frame-Options' to 'deny'
查了好久终于在Google上找到问题原因:(官方文档的答案)
https://docs.djangoproject.com/en/3.0/ref/clickjacking/
clickjacking中间件和装饰器提供了易于使用的保护,以防止clickjacking。当恶意站点诱使用户单击他们已加载到隐藏框架或iframe中的另一个站点的隐藏元素时,会发生这种类型的攻击。
二、关于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中展示
三、Django有关配置
3.1 Django默认的配置
在项目的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.")
上一篇:搭建简易静态文件http服务器
下一篇:Mysql创建或导入函数时报错