文章目录

  • 如何禁用Spring Boot内置Undertow的HTTP TRACE/TRACK
    • 前言
    • 测试应用是否允许HTTP TRACE
    • 禁用Spring Boot内置的Undertow的HTTP TRACE/TRACK
    • 参考文档

如何禁用Spring Boot内置Undertow的HTTP TRACE/TRACK

前言

因为安全原因,需要禁用Spring Boot内置Web服务器的HTTP TRACE/TRACK方法。

  • Spring Boot版本:spring-boot:2.2.2.RELEASE
  • 内置Web服务器:Undertow

测试应用是否允许HTTP TRACE

curl -v -X TRACE http://<ip>:<port>

如果应用允许HTTP TRACE,响应信息为200 OK

如果应用不允许HTTP TRACE,响应信息为405 Method Not Allowed

禁用Spring Boot内置的Undertow的HTTP TRACE/TRACK

autoconfigure包下,创建一个配置类UndertowWebServerCustomizerConfig,禁用HTTP TRACE/TRACK方法。

示例代码:

package com.example.demo.autoconfigure;

import io.undertow.server.HandlerWrapper;
import io.undertow.server.HttpHandler;
import io.undertow.server.handlers.DisallowedMethodsHandler;
import io.undertow.util.HttpString;
import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Configuration;


@Configuration
public class UndertowWebServerCustomizerConfig implements WebServerFactoryCustomizer<UndertowServletWebServerFactory> {

    @Override
    public void customize(UndertowServletWebServerFactory factory) {
        factory.addDeploymentInfoCustomizers(deploymentInfo -> {
            deploymentInfo.addInitialHandlerChainWrapper(new HandlerWrapper() {
                @Override
                public HttpHandler wrap(HttpHandler handler) {
                    HttpString[] disallowedHttpMethods = {HttpString.tryFromString("TRACE"),
                            HttpString.tryFromString("TRACK")};
                    return new DisallowedMethodsHandler(handler, disallowedHttpMethods);
                }
            });
        });
    }
}

resources/META-INF/spring.factories中设置自动配置类。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.demo.autoconfigure.UndertowWebServerCustomizerConfig

关于Spring Boot autoconfigure参见:

  • Create a Custom Auto-Configuration with Spring Boot

如果使用@Component注解,而不是autoconfigure的做法,需要确保Spring Boot Application启动时Component Scan会包含该类所在的包路径,否则设置不会生效。

参考文档

  • https://stackoverflow/questions/45336518/disable-http-track-trace-in-undertow-using-spring-boot
  • How to disable Trace/Track in Apache/httpd
  • Container Configuration in Spring Boot 2

更多推荐

如何禁用Spring Boot内置Undertow的HTTP TRACE/TRACK