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);
    }
}

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<UndertowServletWebServerFactory> {
    @Override
    public void customize(UndertowServletWebServerFactory factory) {
        factory.addDeploymentInfoCustomizers(deploymentInfo ->
                deploymentInfo.addInitialHandlerChainWrapper(httpHandler -> new CustomHttpHandler(httpHandler))
        );
    }
}

但是对于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<Void> 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);
    }
}
相关推荐
momo061179 分钟前
Redis新手入门 -- 学习笔记
redis·后端
zhangjw3410 分钟前
第47篇:Java综合实战:电商秒杀系统(高并发场景)
java·开发语言
井云AI16 分钟前
vendor 资源包是什么:井云 DSH 客户端打包为什么离不开它
后端·智能体小程序
土司大王20 分钟前
LeetCode hot100 回溯专题总结:Java 通用模板、决策树模型
java·算法·leetcode·决策树
重生之我是Java开发战士33 分钟前
【Spring Cloud】Nacos注册中心
后端·spring·spring cloud
Wang's Blog43 分钟前
Java框架快速入门:Spring Security+OAuth2之用户注册与唯一性校验实现
java·数据库·spring
Wang's Blog1 小时前
Java框架快速入门: Spring Security+OAuth2之多因子认证与TOTP实战
java·spring·ui
程序员20071 小时前
AI 编程工具链碎片化?基于多端兼容的统一 Agent Rules 架构实践
后端
程序员20071 小时前
拒绝 AI 代码“暗度陈仓”:工程级 AI 编码边界与防护规则设计
后端
yunwei371 小时前
eBPF 教程:追踪 CUDA GPU 操作
linux·后端·性能优化