欧酷网

您的位置:主页>安全>

HTTP协议安全头部X-Content-Type-Options引入的问题

正文预览

前段时间测试MM反馈了一个问题,在富文本编辑器里上传的图片无法正常呈现。因为Jackie在本机的环境上没有观察类似的现象,而恰好那天测试环境的某个重要配项被改错了,于是Jackie想当然的归类为配置项错误引入的问题。但修改完测试环境的配置项后,测试反馈富文本编辑器内图片无法呈现的现象依然存在。

这下就有点麻烦了,问题是在版本上线的前一天晚上发现的,如果问题不能尽快处理,势必对第二天的版本上线产生影响。虽然逢上线必加班至深夜,但也不能让问题挂在Jackie手里。

时间紧急,问题诡异,Jackie马上放下手头的工作,全力投入分析工作中。

排查过程

  • 如前所述,配置项修改正确后,问题现象仍然存在,因此首先排除了配置项配置引入问题的可能。
  • 请测试MM帮忙复现问题,仔细观察之后,发现使用不同浏览器访问问题页面时可以观察到不同的现象:
    • 使用Chrome访问页面时,富文本编辑器内的图片可以正常呈现。
    • 使用IE9、IE11访问页面时,富文本编辑器内的图片无法呈现。从浏览器的呈现效果看,貌似是图片加载失败;但在调试器的网络面板查看页面资源的加载情况,可以观察到浏览器发起了图片的获取请求,而Web应用确实返回了图片信息;但就是没有呈现出来。
    • 直接把富文本编辑器的内图片的URL复制出来,贴到浏览器的地址栏里访问,图片可以正常呈现。
  • 在生产环境和体验环境上做对比验证,使用IE9、IE11访问这两个环境,查看富文本编辑器内的图片,没有观察到前述的问题,因此可以判定测试MM在测试环境上发现的问题是最近引入的,时间范围不超过2个星期,因为那段时间项目组早已切换为两周一迭代的节奏。
  • 检查富文本编辑器相关代码的提交记录,发现最近的提交记录远在几个月前,因此基本可以排除富文本编辑器自身代码的问题。
  • 肿么搞呢?似乎进入了死胡同。看来常规的方法都不见效,只能逐一排查代码提交记录了。

幸运的是提交记录不多,10分钟之内被Jackie扫描了一遍;大部分提交记录都是清白了,唯一可疑的提交记录来自于Jackie本人,果然这个问题只能由Jackie来定位和分析。为了解决AppScan报告中提到的“HTTP响应缺少安全头部”的警告,Jackie在发现问题的那天早上修改了Tomcat的配置,增加了安全头部相关的过滤器,而晚上留在办公室加班,目的就是要确认前述的警告是否已消除。

为了确认前述问题和HTTP安全头部的相关性,Jackie手工修改测试环境上Tomcat的配置,去掉了增加安全头部的过滤器,重启Tomcat后尝试重现问题,惊喜的发现,富文本编辑器内的图片恢复正常呈现,这说明HTTP响应增加安全头部之后,对基本功能产生了影响。

当前启用了HTTP协议的安全头部的如下几个:

  • Strict-Transport-Security
  • X-Frame-Options
  • X-Content-Type-Options
  • X-XSS-Protection

范围比较小,逐个排查之后,发现前述问题现象和X-Content-Type-Options相关,因此决定仍然启用HTTP安全头部的输出,但禁用X-Content-Type-Options,富文本编辑器内的图片可以正常呈现,同时不会对安全性造成很大的影响。

本来觉得修改Tomcat的配置和业务不相关,不会有什么问题,也没有过基本功能,结果偏偏天不遂人愿,还真让测试MM发现个诡异问题。看来侥幸心理不能有,该做的工作不能省,否则就得加班、加倍的补回来。

下面使用最少的样例代码来说明问题是如何发生的。

问题是如何发生的

准备复现环境

jsp页面

<%@ page session="false" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %><!DOCTYPE html>
<html lang="en">    
            
 

GetPicture的实现

如下这段代码的实现存在问题,使用流方式返回数据时,没有显式指定

 

web.xml

 

使用浏览器观察

重温

一些安全相关的HTTP响应头

中对的介绍。

互联网上的资源有各种类型,通常浏览器会根据响应头的Content-Type字段来分辨它们的类型。例如:”text/html”代表html文档,”image/png”是PNG图片,”text/css”是CSS样式文档。然而,有些资源的Content-Type是错的或者未定义。这时,某些浏览器会启用MIME-sniffing来猜测该资源的类型,解析内容并执行。

使用浏览器调试面板来观察HTTP响应的头部,对上文做验证。

  1. 未启用时,HTTP响应的头部如下
  2. 修改$CATALINA_BASE/conf/web.xml,启用

    使用浏览器的调试面板观察Tomcat响应浏览器请求时的HTTP头部

    此时,使用浏览器访问页面时,图片不能正常呈现。

  3. 修改$CATALINA_BASE/conf/web.xml,禁用特性

    使用浏览器的调试面板观察Tomcat响应浏览器请求时的HTTP头部

    此时,使用浏览器访问页面时,图片可以正常呈现。

  4. 修改$CATALINA_BASE/conf/web.xml,恢复特性

    修改类的实现,写入图片流前先设置HTTP响应头部,取值为

    使用浏览器的调试面板观察Tomcat响应浏览器请求时的HTTP头部

    此时,使用浏览器访问页面时,图片可以正常呈现。

结论

按照

减少 MIME 类型的安全风险

的介绍,IE的行为受的影响,如果Web应用没有返回,那么IE9、IE11将拒绝加载相关资源。

如果服务器发送响应头 “X-Content-Type-Options: nosniff”,则 script 和 styleSheet 元素会拒绝包含错误的 MIME 类型的响应。这是一种安全功能,有助于防止基于 MIME 类型混淆的攻击。

从前述的测试结果看,的确证实了对IE9、IE11的影响。

但仍有不明之事,文章

减少 MIME 类型的安全风险

只提到了标签,没有提到标签,不了解为什么对图片的加载也会产生影响。后来使用Windows 10的Edge做验证,发现Edge也存在相同的问题,只要启用了,那么图片必定呈现不出来。Jackie猜,这也许是文档太旧了,或者是Jackie没有找到最新的文档。

另外按照

Jerry Qu

的文章

一些安全相关的HTTP响应头

的描述,应该会影响Chrome的行为,但从测试结果看,使用标签加载图片时,如果Web应用没有返回,无论是否启用,Chrome都可以正常呈现图片,这一点比较奇怪。

参考资料

  • 一些安全相关的HTTP响应头

  • header的安全配置指南

  • ZT header的安全配置指南

  • 减少 MIME 类型的安全风险

 

若非注明,均为原创,欢迎转载,转载请注明来源:

HTTP协议安全头部X-Content-Type-Options引入的问题

链接地址:

http://www.jackieathome.net/archives/369.html

  • 点赞

  • 收藏

  • 分享

  •    
    • 文章举报

拓宽视野

 
发布了158 篇原创文章 ·    获赞 86 ·    访问量 34万+  

私信

关注

相关文章推荐