IE的MIME嗅探

IE从SP2开始增加了MIME嗅探功能,不仅依据Content-Type判断内容类型,还会根据Response流内容判断。若Content-Type设为text/plain,但内容为HTML格式,则IE可能误判并执行HTML代码。为避免安全风险,可通过设置Content-Disposition头,指定文件名来强制浏览器下载文件而非解析。
    IE从SP2开始进行了MIME嗅探的功能。以前的浏览器都是通过Content-Type来判断Resoponse流是何种类型的内容,进而调用不用的处理程序进行处理,如text/html表明接受的html代码,需要做html页面渲染,text/jpeg表明接受的图片文件,需要对接受到的数据流调用处理jpeg格式流的处理程序。
    IE则在此基础上增加了对MIME的嗅探功能,不仅仅根据Content-Type来判断,而且会根据Response流的内容来进行判断。加入Content-Type的值是text/plain,在非IE浏览器中,text/plain表明的是普通的文本,浏览器只需要把内容展示出来就可以了。但是在IE中,如果Response的内容是类似如下的内容:
  1. <html>
  2. <script>
  3. alert(/xss/);
  4. </script>
  5. </html>
    则IE执行MIME嗅探后,会判定其内容是text/html类型,此时就会执行html的渲染逻辑,在浏览器中弹出/xss对话框。
    IE的此特性可以得出,在Web程序中,返回的Response一定要具有正确的Content-Type值,避免IE的“聪明”。

    问题是:如果我们的确需要给用户提供一个普通的文件进行下载,该文件的内容含有如上格式的html相关字符,此时Content-Type的值是需要设置成text/plain(因为这个文件的确是plain的),该怎么办呢?
    解决方式是:使用Content-disposition.
    Content-disposition格式:
         "content-disposition","attachment; filename=fname.ext"
    在filename=的后面写上文件名(如foo.txt),此时浏览器会直接弹出对话框提示用户是否保存此文件。
async onDownloadStart () { console.log('开始下载...') this.$message.info('开始下载文件') try { const res = await userexport([]) // 打印 res 查看实际的 Blob 数据 console.log(res) const filename = '用户信息.xlsx' // const contentType = res.headers?.['content-type'] || 'application/octet-stream' const contentType = res.type const blob = new Blob([res], { type: contentType }) const url = window.URL.createObjectURL(blob) const dom = document.createElement('a') dom.style.display = 'none' dom.href = url dom.setAttribute('download', filename) document.body.appendChild(dom) dom.click() document.body.removeChild(dom) window.URL.revokeObjectURL(url) console.log('下载成功:', res) this.$message.success('文件下载成功') } catch (error) { console.error('下载失败:', error) this.$message.error('下载失败,请稍后重试') } }, 这是前台对于导出excel的设置 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("UTF-8"); // 使用 URLEncoder 对文件名进行编码,确保兼容性 String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20"); response.addHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName + ".xls"); response.setHeader("Content-Disposition", "attachment; filename=\"report.xls\""); // 强制下载,文件名带扩展名 response.setHeader("X-Content-Type-Options", "nosniff"); // 防止 MIME 嗅探 // 或者兼容旧浏览器(同时提供 filename 和 filename*) // response.addHeader("Content-Disposition", "attachment; filename=\"" + fileName + ".xlsx\"; filename*=UTF-8''" + encodedFileName + ".xlsx"); ServletOutputStream out = response.getOutputStream(); book.write(out); out.flush(); out.close();这是java后台对于导出excel的设置,为什么能够出现在谷歌浏览器导出的excel文件未受保护,火狐浏览器导出的excel文件受保护,我不像文件受保护需要怎么配置,是配置前台还是配置后台
07-23
Accept application/json, text/plain, */* Accept-Encoding gzip, deflate, br, zstd Accept-Language zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Authorization eyJjdHkiOiJIUzI1NiIsInR5cCI6IkpXVCIsImFsZyI6IkhTMjU2In0.eyJwZXJtaXNzaW9ucyI6Ilt7XCJhdXRob3JpdHlcIjpcInJlY2hhcmdlXCJ9LHtcImF1dGhvcml0eVwiOlwiYWZmYWlyc1wifSx7XCJhdXRob3JpdHlcIjpcInN5c3RlbVwifSx7XCJhdXRob3JpdHlcIjpcImNvcHktbWV0ZXJcIn0se1wiYXV0aG9yaXR5XCI6XCJyZXBvcnRcIn0se1wiYXV0aG9yaXR5XCI6XCJhbmFseXNpc1wifSx7XCJhdXRob3JpdHlcIjpcIm1haW50ZW5hbmNlXCJ9LHtcImF1dGhvcml0eVwiOlwiYXBwbGljYXRpb25cIn0se1wiYXV0aG9yaXR5XCI6XCJsb2dcIn0se1wiYXV0aG9yaXR5XCI6XCJvdGhlclwifSx7XCJhdXRob3JpdHlcIjpcImRhc2hib2FyZFwifSx7XCJhdXRob3JpdHlcIjpcImN1c3RvbWVyXCJ9LHtcImF1dGhvcml0eVwiOlwiUk9MRV9BRE1JTlwifV0iLCJpZCI6MSwiZXhwIjozNjQ2NTQxMjk2LCJ1c2VybmFtZSI6ImFkbWluIn0.o1W0LnqKQ6HBe3Tm_xc4dQXmOhF7Ho9KYiZ3dJN9n6c Connection keep-alive Content-Length 2 Content-Type application/json Cookie JSESSIONID=3YA5rtveexBSXoYFglr4j2HNdDXFNHkf0zJrBlB6 Host localhost:8080 Origin http://localhost:8080 Priority u=0 Referer http://localhost:8080/customer Sec-Fetch-Dest empty Sec-Fetch-Mode cors Sec-Fetch-Site same-origin User-Agent Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:139.0) Gecko/20100101 Firefox/139.0 这是火狐浏览器导出文件的请求头 application/json, text/plain, */* accept-encoding gzip, deflate, br, zstd accept-language zh-CN,zh;q=0.9 authorization eyJjdHkiOiJIUzI1NiIsInR5cCI6IkpXVCIsImFsZyI6IkhTMjU2In0.eyJwZXJtaXNzaW9ucyI6Ilt7XCJhdXRob3JpdHlcIjpcImN1c3RvbWVyXCJ9LHtcImF1dGhvcml0eVwiOlwicmVjaGFyZ2VcIn0se1wiYXV0aG9yaXR5XCI6XCJhZmZhaXJzXCJ9LHtcImF1dGhvcml0eVwiOlwic3lzdGVtXCJ9LHtcImF1dGhvcml0eVwiOlwiY29weS1tZXRlclwifSx7XCJhdXRob3JpdHlcIjpcInJlcG9ydFwifSx7XCJhdXRob3JpdHlcIjpcImFuYWx5c2lzXCJ9LHtcImF1dGhvcml0eVwiOlwibWFpbnRlbmFuY2VcIn0se1wiYXV0aG9yaXR5XCI6XCJhcHBsaWNhdGlvblwifSx7XCJhdXRob3JpdHlcIjpcImxvZ1wifSx7XCJhdXRob3JpdHlcIjpcIm90aGVyXCJ9LHtcImF1dGhvcml0eVwiOlwiZGFzaGJvYXJkXCJ9LHtcImF1dGhvcml0eVwiOlwiUk9MRV9BRE1JTlwifV0iLCJpZCI6MSwiZXhwIjozNjQ2MTA3MDk0LCJ1c2VybmFtZSI6ImFkbWluIn0.aIIIU1blfIHTbCM9mVY8_6Aj27IiwieOyHDK1IflJSo cache-control no-cache connection keep-alive content-length 2 content-type application/json cookie JSESSIONID=GjCp6r_LYcQVO201PsIOuppOMQ3xoAqeSdYrCTvJ; Webstorm-be5713b8=c4fd27ab-3f56-4132-9bd3-601434e5118c host localhost:8080 origin http://localhost:8080 pragma no-cache referer http://localhost:8080/customer sec-ch-ua "Google Chrome";v="137", "Chromium";v="137", "Not/A)Brand";v="24" sec-ch-ua-mobile ?0 sec-ch-ua-platform "Windows" sec-fetch-dest empty sec-fetch-mode cors sec-fetch-site same-origin user-agent Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36这是谷歌浏览器导出文件的请求头 还是火狐浏览器导出的excel文件就有文件保护,谷歌浏览器导出的excel文件就没有
07-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值