likes
comments
collection
share

大聪明教你学Java | Spring Boot 项目设置 X-Content-Type-Options 响应头

作者站长头像
站长
· 阅读数 14

前言

我们在开发应用系统的时候,总会遇到各种各样的漏洞,即便是项目上线后,甲方霸霸也会找专门搞安全的公司来对我们的应用系统进行扫描,扫描完后或多或少也会出现一些漏洞,我们就得加班对这些漏洞进行修复...

大聪明开发的应用系统已经上线三年了,然而就在昨天依然被扫描出了一个漏洞 —— 远程 Web 系统应用程序不采取措施来减轻一类 Web 应用程序漏洞,说白了就是远程网络应用程序不设置 X-Content-Type 响应头。刚看到扫描报告的时候还真有点麻爪,不知道如何下手,最后经过一番努力还是成功的修复了这个漏洞✌,那么借此机会,大聪明就和大家分享一下如何修复此类漏洞😊。

漏洞修复

漏洞简介

首先我们先简单说说 Content-Type 响应头有什么用👇

互联网上的资源类型有很多种,通常浏览器会根据响应头的 Content-Type 字段来分辨这些资源的类型。比如 “text/html” 代表的是 html 类型的文件, “image/png” 则代表的是 png 图片,“text/css” 则是 css 样式文件。然而有些资源的 Content-Type 字段是错的或者未定义。此时某些浏览器就会启用 MIME-sniffing 来猜测该资源的类型(但是猜测的并不一定准确),猜测后再解析该文件的内容并开始执行。如果此时我们给一个 html 文件指定 Content-Type 为 "text/plain" ,那么在某些浏览器中这个文档依然会被当做 html 文件来解析。因为某些浏览器存在这个特性,攻击者就利用这一特行让原本应该解析为图片的请求被解析为 JavaScript 代码,从而实现一些不可告人的目的🈲。为了防止应用系统被攻击,我们就需要将应用系统的页面都设置上响应头 —— X-Content-Type-Options:nosniff。

说完 Content-Type 响应头,可能有一些小伙伴会想到另外两个响应头—— X-Frame-Options 和 X-XSS-Protection,那么我们这里也简单的说几句👇

  1. X-Frame-Options 响应头:为了减少点击劫持(Clickjacking)而引入的 X-Frame-Options 响应头,这个响应头支持三种配置:① DENY(不允许被任何页面嵌入);② SAMEORIGIN(不允许被本域以外的页面嵌入);③ ALLOW-FROM URL(不允许被指定的域名以外的页面嵌入)。
  2. X-XSS-Protection响应头:该响应头的作用是防范 XSS 攻击,现在主流浏览器都支持该响应头,并且都默认开启了 XSS 保护,该响应头也是有三种配置:① 0(禁用XSS保护);② 1(启用XSS保护);③ 1;mode=block(启用XSS保护,并在检查到XSS攻击时,停止渲染页面)。不过有一点是需要注意的,虽然浏览器提供的防止 XSS 攻击保护机制并不完美,但是开启后仍然可以给予一定的防护能力,所以没有特殊的情况,我们一定不要关闭该响应头。

漏洞修复方法

修复此类漏洞的方式也很简单,下面就针对两种常见情况和大家分享一下修复此类漏洞的方法~

情况一:应用系统部署在 Tomcat 下

如果我们的应用系统部署在了 Tomcat 下,那么我们只需要在 Tomcat 下的 web.xml 配置文件中增加几行配置即可(文件路径:Tomcat 根目录/conf/web.xml)👇

<filter>
    <filter-name>httpHeaderSecurity</filter-name>
    <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
    <init-param>
        <param-name>antiClickJackingOption</param-name>
        <param-value>SAMEORIGIN</param-value>
    </init-param>
    <async-supported>true</async-supported>
</filter>

<filter-mapping>
    <filter-name>httpHeaderSecurity</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

如果我们使用的是低版本的 Tomcat ,有可能会找不到 org.apache.catalina.filters.HttpHeaderSecurityFilter 相关的 jar 包,此时我们可以去高版本的 Tomcat 中将对应的 HttpHeaderSecurityFilter 文件复制到低版本的 Tomcat 中。配置成功后我们需要重启 Tomcat 服务,增加的配置才会生效。如下图所示👇

大聪明教你学Java | Spring Boot 项目设置 X-Content-Type-Options 响应头

情况二:Spring Boot 项目生成的 Jar 包(Tomcat 集成在 Jar 包中)

如果我们使用 Spring Boot 开发应用系统,很多小伙伴都会选择将项目打成 Jar 包来进行部署,此时我们就没办法通过修改 Tomcat 下的 web.xml 配置文件来修复此类漏洞了(毕竟 Spring Boot 帮我们把 Tomcat 集成在项目中了,想找 web.xml 配置文件都找不到😂)。针对此类情况,我们就可以使用过滤器来解决问题👇

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

/**
 * 使用过滤器增加响应头(以 X-Content-Type-Options:nosniff 为例)
 * @description: AddResponseHeaderFilter 
 * @author: 庄霸.liziye
 * @create: 2022-03-03 15:21
 **/
@Component
public class AddResponseHeaderFilter extends OncePerRequestFilter {
 
    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
        FilterChain filterChain) throws ServletException, IOException {
        httpServletResponse.addHeader("X-Content-Type-Options", "nosniff");
        filterChain.doFilter(httpServletRequest, httpServletResponse);
    }
}

过滤器增加后,我们重启一下项目看看效果👇

大聪明教你学Java | Spring Boot 项目设置 X-Content-Type-Options 响应头 解决此类漏洞方式是不是跟简单 (●'◡'●) ,通过这么几行代码就能让我们的应用系统的安全性提升一大截✌~

小结

本人经验有限,有些地方可能讲的没有特别到位,如果您在阅读的时候想到了什么问题,欢迎在评论区留言,我们后续再一一探讨🙇‍

希望各位小伙伴动动自己可爱的小手,来一波点赞+关注 (✿◡‿◡) 让更多小伙伴看到这篇文章~ 蟹蟹呦(●'◡'●)

如果文章中有错误,欢迎大家留言指正;若您有更好、更独到的理解,欢迎您在留言区留下您的宝贵想法。

爱你所爱 行你所行 听从你心 无问东西