乐趣区

关于tomcat:Bug解决思路Tomcat返回不安全的响应头

背景概述

公司平安测试要求接口的申请办法只能是 GET, POST,并且响应头也只能为 GET, POST.

问题形容

在理解到这个需要后,我在过滤器对所有进入服务的申请对立设置响应头:

@WebFilter(urlPatterns = "/*", filterName = "GlobalFilter")
public class GlobalFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException {log.info(">>>>>>>>>>>>>>>>>>>> doFilter <<<<<<<<<<<<<<<<<<<<");
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS");
        response.setHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers"));
        filterChain.doFilter(servletRequest, response);
    }
}

写这段代码是因为我下意识地认为只有设置一个全局的响应头,将 Access-Control-Allow-Methods 设置为 GET,POST 就能够轻松实现测试提出的,响应头只能为 GET, POST 的需要.

这段代码帮我解决了大部分问题,我在自测时“GET,HEAD,POST,PUT,DELETE,OPTIONS”它们的响应头都胜利返回了 GET、POST。贴一张 OPTIONS 申请的截图,他的 Allow-Methos 胜利的返回了 GET,POST.

到这你是不是感觉问题就曾经解决了?

并没有,事件没这么简略,测试很快就让我打脸了,请看下图,当 uri 改为 * 时,Allow 的返回值让我不敢相信本人的眼睛。

问题剖析

在应用 burpsuite 复现问题时,我发现服务的过滤器并没有拦挡到 options * 申请,也就是说申请在进入过滤器前就曾经被解决并响应了。

那么 Filter 之前可能会有哪些容器解决 OPTIONS * 申请了呢?

解决方案

找出问题的起因后,我提出了两个解决方案:

计划一:减少一个新的中间件来拦挡申请解决不平安的申请办法,例如: Nginx。

计划二:批改 Tomcat Adapter, 去除 allow.append(“GET,HEAD,POST,PUT,DELETE,OPTIONS”).

让我猜猜,故事到这你是不是会秒选计划二。

一旦抉择计划二,恶梦就开始了,因为 Tomcat 不能间接批改 Adapter, 你认为只须要批改一行代码,实际上你须要重写”整个“Tomcat, 下回我专门写篇长文来讲讲具体是怎么个重写法。

如果抉择计划一,祝贺你明天能够失常上班了。

location * {if ($request_method = OPTIONS) {
        add_header Content-Length 0;
        add_header Content-Type text/plain;
            add_header 'Access-Control-Allow-Methods' 'GET, POST';
        return 200;
    }
}

思考

其实整篇文章看完,会发现我其实只是解决了一个很小的问题,所以我想说的是本篇的重点并不是问题的答案,而是剖析并解决问题的思路。

到这你认为就完结了吗?不,其实我还想说一点货色。

计划的设计目标是实现业务指标,不是为了设计而设计引入各种高大上的中间件,技术自嗨。

尽管引入 Nginx 能够很不便的解决问题,然而它也会带来新的平安危险。零碎中的元素越多,为了维持零碎的均衡,须要付出的势能必然也越大。零碎拆解的粒度越大,各个组件之间的耦合越小,然而解决的组件间协同问题也就越多。在零碎设计时,要防止适度设计,把握技术计划的外围目标,在这个根底上进行针对性设计。

退出移动版