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

Code Is Never Die !
问题: 在做iframe预览PDF文件时,虽然nginx配置了X-Frame-Options SAMEORIGIN,但在iframe中仍然获取不到内容。

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

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

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

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

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

allow-from uri(http://......) 表示该页面可以在指定来源的 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
  1. 引用装饰器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, 告诉中间件访问该视图时屏蔽在加载iframe时的所有资源:

from django.http import HttpResponse
from django.views.decorators.clickjacking import xframe_options_deny
 
@xframe_options_deny
def deny_xframe(request):
    return HttpResponse('拒绝所有的资源')
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
X-Frame-Options是一个HTTP响应头,用于指示浏览器是否允许将页面嵌入到frameiframe或object中展示。当一个页面设置了X-Frame-Optionsdeny时,浏览器会拒绝在frame中展示该页面,即使是在相同域名的页面中也不允许。\[2\] 这个设置可以用来防止点击劫持攻击,即将一个网站的内容嵌入到另一个恶意网站中,以欺骗用户进行操作。\[3\] 如果你遇到了"Refused to display xxx in a frame because it set X-Frame-Options to deny"的错误,说明该页面设置了X-Frame-Optionsdeny,所以无法在frame中展示。这是一种安全措施,以保护网站的内容不被恶意利用。\[1\] 在开发中,你可以通过设置响应头的X-Frame-Options值来解决这个问题。例如,可以将X-Frame-Options设置为SAMEORIGIN,这样页面就可以在同域名页面的frame中嵌套展示。\[2\] #### 引用[.reference_title] - *1* [Refused to display 'xxx' in a frame because it set 'X-Frame-Options' to 'deny'.](https://blog.csdn.net/Absorbed66c/article/details/100914969)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [解决 Refused to display in a frame because it set 'X-Frame-Options' to 'deny'.问题](https://blog.csdn.net/lizy928/article/details/82535089)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rainux.

生活最美——开心最大

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值