• springboot springcloud gateway 中的 undertow 禁止接收trace请求(修复漏洞)


    1.定义两个类:
    CustomHttpHandler.java

    import io.undertow.server.HttpHandler;
    import io.undertow.server.HttpServerExchange;
    import io.undertow.util.StatusCodes;
    
    public class CustomHttpHandler implements HttpHandler {
        private final HttpHandler next;
    
        public CustomHttpHandler(HttpHandler next) {
            this.next = next;
        }
    
        @Override
        public void handleRequest(HttpServerExchange exchange) throws Exception {
            if ("TRACE".equals(exchange.getRequestMethod().toString())) {
                exchange.setStatusCode(StatusCodes.FORBIDDEN);
                exchange.endExchange();
                return;
            }
            // 其他处理逻辑
            next.handleRequest(exchange);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    UndertowConfigCustomizer.java

    import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
    import org.springframework.boot.web.server.WebServerFactoryCustomizer;
    import org.springframework.stereotype.Component;
    
    @Component
    public class UndertowConfigCustomizer implements WebServerFactoryCustomizer {
        @Override
        public void customize(UndertowServletWebServerFactory factory) {
            factory.addDeploymentInfoCustomizers(deploymentInfo ->
                    deploymentInfo.addInitialHandlerChainWrapper(httpHandler -> new CustomHttpHandler(httpHandler))
            );
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    但是对于spring cloud gateway 网关服务 还需要单独定义过滤器,才能修复
    DisableTraceFilter.java

    import io.netty.handler.codec.http.HttpMethod;
    import org.springframework.core.Ordered;
    import org.springframework.http.HttpStatus;
    import org.springframework.stereotype.Component;
    import org.springframework.web.server.ServerWebExchange;
    import org.springframework.web.server.WebFilter;
    import org.springframework.web.server.WebFilterChain;
    import reactor.core.publisher.Mono;
    
    @Component
    public class DisableTraceFilter implements WebFilter, Ordered {
    
        @Override
        public int getOrder() {
            // 确保此过滤器优先于其他过滤器
            return Integer.MIN_VALUE;
        }
    
        @Override
        public Mono filter(ServerWebExchange exchange, WebFilterChain chain) {
            if (HttpMethod.TRACE.name().equals(exchange.getRequest().getMethod().name())) {
                // 返回403禁止访问
                exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
                return exchange.getResponse().setComplete();
            }
            return chain.filter(exchange);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
  • 相关阅读:
    R语言机器学习之caret包详解
    手把手带你申请软著!助你提高通过率!!!
    JMH – Java基准测试
    [机器学习]-分类问题常用评价指标、混淆矩阵及ROC曲线绘制方法-python实现(多分类)
    [附源码]java毕业设计疫情防控期间网上教学管理
    D. Tournament Countdown(交互题)
    0.5 如何运行Python代码
    最好的开放式蓝牙耳机有哪些?排名前五的开放式耳机五强
    过滤器---普通过滤器使用、串联过滤器、局部与全局过滤器
    无线耳机哪个音质好?无线入耳式蓝牙耳机音质排行榜
  • 原文地址:https://blog.csdn.net/qq_33399709/article/details/137972663