Django 之,在上传图片的时候出现:'X-Frame-Options' to 'deny'成功解决办法


 django解决示例

解决 Refused to display in a frame because it set 'X-Frame-Options' to 'deny'.问题

 

X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面可否在 frame , iframe 或者 object 中展现的标记。网站可以使用此功能,来确保自己网站的内容没有被嵌到别人的网站中去,也从而避免了点击劫持 (clickjacking) 的攻击。

只有当用户使用支持X-Frame-Options的浏览器访问文档时,才提供增加的安全性。Content-Security-Policy HTTP头中的frame-ancestors指令会替代这个非标准的header.CSP的frame-ancestors会在壁虎4.0中支持,但是并不会被所有浏览器支持。然而X-Frame-Options是个已广泛支持的非官方标准,可以和CSP结合使用。

 

so,浏览器默认遵循X-Frame-Options协议头,它表明一个资源是否允许加载到frame或者iframe中。如果响应包含值为SAMEORIGIN的协议头,浏览器会在frame中加载同源请求的资源。如果协议头设置为DENY,浏览器会在加载frame时屏蔽所有资源,无论请求来自于哪个站点。

 

 

语法

X-Frame-Options 有三个可能的值:

X-Frame-Options: deny
X-Frame-Options: sameorigin
X-Frame-Options: allow-from https://example.com/

换一句话说,如果设置为 deny,不光在别人的网站 frame 嵌入时会无法加载,在同域名页面中同样会无法加载。另一方面,如果设置为sameorigin,那么页面就可以在同域名页面的 frame 中嵌套。

deny

  表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。

sameorigin

  表示该页面可以在相同域名页面的 frame 中展示。

allow-from uri

  表示该页面可以在指定来源的 frame 中展示。

 

 

Django中提供了一些简单的方法来在你站点的响应中包含这个协议头:

(1)一个简单的中间件,在所有响应中设置协议头。

如果要为你的站点中所有的响应设置相同的X-Frame-Options值,就可以将项目中settings.py文件中的添加中间件:‘ django.middleware.clickjacking.XFrameOptionsMiddleware ’设置为‘MIDDLEWARE’:

MIDDLEWARE = [
	'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

在开启该中间件之后,默认会为任何开放的HttpResponse设置X-Frame-Options协议头为DENY,如果你想要设置为SAMEOGIGIN,可以在settings.py文件中设置:

X_FRAME_OPTIONS = 'SAMEORIGIN'

 

但是这样的话会使该站点所有的视图都使用X-Frame-Options协议头,对于某些视图函数,我们可以使用特定的装饰器告诉中间件不要设置协议头.

(2)使用装饰器

在views.py文件中使用装饰器

 导入模块

from django.views.decorators.clickjacking import xframe_options_sameorigin, xframe_options_exempt,xframe_options_deny

1.引用装饰器xframe_options_sameorigin,允许同源访问的装饰器

from django.views.decorators,clickjacking import xframe_options_sameorigin

@xframe_options_sameorigin
def send_file(request,filename):
    fp = open(os.path.join(UEDITOR_UPLOAD_PATH,filename),'rb')
    response = FileResponse(fp)
    response['X-Frame-Options'] = settings.X_FRAME_OPTIONS
    return response

  

2. 引用装饰器xframe_options_exempt,告诉中间件访问该视图时不要设置协议头: 

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

@xframe_options_exempt
def xframe_exempt(request):
	return HttpResponse('这个页面是安全的')

 

3.引用装饰器xframe_options_deny, 告诉中间件访问该视图时屏蔽在加载frame时的所有资源:

from django.http import HttpResponse
from django.views.decorators.clickjacking import xframe_options_deny

@xframe_options_deny
def deny_xframe(request):
	return HttpResponse('拒绝所有的资源')

  

更新信息资料   https://developer.mozilla.org/zh-CN/docs/Web/HTTP/X-Frame-Options

这个页面写了通过Nginx和iis和Apache来解决这个问题,但是在我们平时的开发中可以通过设置header的值来解决这个问题

 

 




免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM