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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值