设置X-Content-Type-Options响应标头会破坏PNG文件

时间:2017-06-20 09:01:18

标签: java security xss response-headers

我希望在我的应用程序中明确这些标题:

response.setHeader("Content-Security-Policy", "frame-ancestors 'self'");    
response.setHeader("X-Content-Type-Options", "nosniff"); 
response.setHeader("X-XSS-Protection", "1; mode=block"); 
response.setHeader("Strict-Transport-Security", "max-age=7776000; cludeSubdomains");
String contextPath = ((HttpServletRequest) request).getContextPath();
response.setHeader("SET-COOKIE", "JSESSIONID=" +
    ((HttpServletRequest)request).getSession().getId() +
    ";Path="+contextPath+";Secure;HttpOnly");
response.setHeader("Cache-control", "no-cache, no-store,max-age=0, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setHeader("X-Frame-Options", "SAMEORIGIN");

截至目前,我知道:

  1. 内容安全策略是一个增加的安全层,有助于 检测并缓解某些类型的攻击,包括跨站点 脚本(XSS)和数据注入攻击。
  2. X-Content-Type-Options响应HTTP标头是服务器用来指示不应更改和遵循Content-Type标头中公布的MIME types的标记。
  3. X-XSS-protection是XSS过滤器。
  4. Strict-Transport-Security是一种选择加入安全增强功能,由Web应用程序通过使用特殊响应标头指定。支持的浏览器收到此标头后,浏览器将阻止通过HTTP将任何通信发送到指定的域,而是通过HTTPS发送所有通信。
  5. 高速缓存控制通用标头字段用于指定请求和响应中的高速缓存机制的指令。
  6. Pragma意味着阻止客户端缓存响应。但是,Cache控件和Pragma响应头之间存在差异,因为它们都做同样的工作,但Pragma是HTTP / 1.0实现,而cache-control是同一概念的HTTP / 1.1实现。
  7. X-Frame-Options用于指示是否允许浏览器在frameiframeobject中呈现网页。
  8. 现在我在CrossSiteScriptingFilter中有这个代码,它在web.xml映射,进行XSS过滤。但结果是它更改了.png文件编码并删除了损坏PNG文件编码的?个字符,从而提供了错误的PNG数据。

    请检查屏幕截图,它没有?个字符,并被空字符串替换,因此它不允许.png个文件呈现。 enter image description here

    我分析了代码,发现删除响应标头X-Content-Type-Options正在完成工作(.png文件正在正确呈现。)

    我仍然不确定为什么会出现此问题以及为什么X-Content-Type-Options?字符替换为创建问题的""字符串。有人可以解释一下。

    提前致谢:)

1 个答案:

答案 0 :(得分:1)

听起来我觉得你非常接近你的答案:特殊字符的XSS过滤对于二进制文件来说是一个坏主意,它可能有效地使用在(x)html,js或类似文件中不合适的字符解释文件。

通常,Web应用程序会将此类资源拆分到自己的目录中,该目录将对其内容应用不同的进程,例如,不对其运行XSS保护过滤器。配置过滤器时,应排除已知专门包含二进制数据的路径,例如上述资源目录。

看起来可能是标题导致/禁止过滤器猜测MIME类型,将二进制文件误解为html或类似(可能基于PNG标题中的文本)或者仅仅依赖于过滤器默认,然后清理它。可能是你的MIME类型标题是错误的并且嗅探器正在修复它(因此告诉它不要这样做会阻止它恢复)。