自定义 Spring Boot HTTP TRACE disabled 错误响应

Posted

技术标签:

【中文标题】自定义 Spring Boot HTTP TRACE disabled 错误响应【英文标题】:Customize Spring Boot HTTP TRACE disabled error response 【发布时间】:2021-02-24 20:04:00 【问题描述】:

一家安全公司已将我们的 Spring Boot 2.3.4 应用程序标记为在发送 HTTP TRACE 请求时返回的错误响应。我们正在使用默认情况下已经禁用 HTTP TRACE 的 Tomcat 容器,但是响应确实包含 TRACE 信息。这是输出:

$ curl -k -i -X TRACE --cookie "VULNERABLE=Yes" http://localhost:9090

HTTP/1.1 405
Allow: HEAD, DELETE, POST, GET, OPTIONS, PUT
Content-Type: message/http
Content-Length: 116
Date: Fri, 16 Oct 2020 20:41:51 GMT

TRACE /error HTTP/1.1
host: localhost:9090
user-agent: curl/7.64.1
accept: */*
cookie: VULNERABLE=Yes

我能够改变这一点的唯一方法是在使用“@Configuration”注释的配置类中使用此代码启用 HTTP TRACE 请求:

    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() 
        return customizer -> customizer.addConnectorCustomizers(connector -> 
            connector.setAllowTrace(true);  // filtered in the SecurityFilter with custom error
        );
    

然后我添加了一个 servlet 过滤器来拦截请求并返回自定义响应:

@Component
@Order(1)
public class SecurityFilter implements Filter 

    @Override
    public void init(FilterConfig filterConfig) throws ServletException 
    

    @Override
    public void doFilter(ServletRequest servletRequest,
                         ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException, ServletException 
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        if (HttpMethod.TRACE.name().equals(request.getMethod())) 
            // trace not allowed
            HttpServletResponse response = (HttpServletResponse) servletResponse;
            response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
            response.setContentType("message/http");
            response.getWriter().println("TRACE method not allowed");
            response.getWriter().flush();
            return;
        
        filterChain.doFilter(servletRequest,servletResponse);
    

    @Override
    public void destroy() 
    

来自同一个 curl 请求的响应是:

HTTP/1.1 405 
Content-Type: message/http;charset=ISO-8859-1
Transfer-Encoding: chunked
Date: Thu, 12 Nov 2020 19:11:13 GMT

TRACE method not allowed

有没有人遇到过类似的问题?似乎启用跟踪只是为了能够更改响应正文不是一个好主意。

【问题讨论】:

在 Spring Boot 中有 3 种方法可以做到这一点,请查看 ***.com/questions/42367975/… 【参考方案1】:

你可以设置

spring.mvc.dispatch-trace-request: true

在您的 application.yml 中。

然后,“org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController” 将创建没有任何跟踪信息的错误响应。

问候。

【讨论】:

以上是关于自定义 Spring Boot HTTP TRACE disabled 错误响应的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 异常自定义处理 - 意外的 HTTP 状态

如何为 Spring Boot 应用程序设置自定义 Http 标头“服务器”

自定义 Spring Boot HTTP TRACE disabled 错误响应

Spring Boot - 如何在 HTTP Post api 中传递自定义值?

由 CORS 阻止的 Spring Boot 自定义响应标头

第四十章Spring Boot 自定义拦截器