Java 设置X-Content-Type-Options响应头会损坏PNG文件

Java 设置X-Content-Type-Options响应头会损坏PNG文件,java,security,xss,response-headers,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-Se

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

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");
到目前为止,我知道:

  • 内容安全策略是一个附加的安全层,有助于 检测并缓解特定类型的攻击,包括跨站点攻击 脚本(XSS)和数据注入攻击
  • X-Content-Type-Options响应HTTP标头是服务器使用的一个标记,用于指示不应更改内容类型标头中的播发内容,而应遵循该标记
  • 是XSS过滤器
  • 严格传输安全性是一种选择性加入安全增强,由web应用程序通过使用特殊响应头指定。一旦受支持的浏览器收到此标头,该浏览器将阻止通过HTTP向指定域发送任何通信,而是通过HTTPS发送所有通信
  • Cache control general header字段用于为请求和响应中的缓存机制指定指令
  • Pragma的意思是防止客户端缓存响应。但是,缓存控制和Pragma响应头之间存在差异,因为它们都执行相同的工作,除了Pragma是HTTP/1.0实现,而缓存控制是相同概念的HTTP/1.1实现
  • X-Frame—用于指示是否允许浏览器在
    框架
    iframe
    对象
    中呈现页面的选项
  • 现在我在CrossSiteScriptingFilter中有了这段代码,它映射到执行XSS过滤的
    web.xml
    。但结果是,它更改了
    .png
    文件编码,并删除了损坏png文件编码的
    字符,从而给出了错误的png数据

    请检查屏幕截图,它没有
    字符,被空字符串替换,因此不允许渲染
    .png
    文件

    我分析了代码,发现删除响应头
    X-Content-Type-Options
    就可以了(
    .png
    文件渲染正确)

    我仍然不确定为什么会出现此问题,以及为什么
    X-Content-Type-Options
    将产生此问题的
    字符替换为
    “”
    字符串。谁能解释一下


    提前感谢:)

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

    通常,web应用程序会将这些资源拆分到自己的目录中,并对其内容应用不同的进程,例如,不在其上运行XSS保护过滤器。配置筛选器时,应排除已知专门包含二进制数据的路径,如前面提到的资源目录


    很可能的情况是,标题导致/禁止过滤器猜测MIME类型,将二进制文件误解为html或类似文件(可能基于PNG标题中的文本),或者默认情况下使用过滤器,然后对其进行清理。可能是您的MIME类型头错误,嗅探器正在修复它(因此告诉它不要这样做会阻止它恢复)。

    +1对于答案,web.xml中是否有排除XSS脚本的已知路径的选项。现在我有一个修复方法,在继续处理响应头之前,我检查了过滤器中的路径。如果有任何其他的解决办法,我想除了它,我很高兴知道它。我不知道有没有不变得复杂。这个问题似乎相关,他们得出了类似的结论:但公认的答案是代码。