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创建或导入函数时报错