diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxInnerHeaderRemoveFilter.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxInnerHeaderRemoveFilter.java index 504eb1ed0..a0a3fe13e 100644 --- a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxInnerHeaderRemoveFilter.java +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxInnerHeaderRemoveFilter.java @@ -2,13 +2,13 @@ package com.pig4cloud.pigx.common.security.component; import cn.hutool.core.net.Ipv4Util; import cn.hutool.core.util.StrUtil; -import cn.hutool.extra.servlet.JakartaServletUtil; import com.pig4cloud.pigx.common.core.constant.SecurityConstants; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.net.IPv6Utils; import org.jetbrains.annotations.NotNull; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.http.HttpStatus; @@ -39,23 +39,23 @@ public class PigxInnerHeaderRemoveFilter extends OncePerRequestFilter { */ @Override protected void doFilterInternal(HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull FilterChain filterChain) throws ServletException, IOException { - // 获取客户端IP地址 - String clientIP = JakartaServletUtil.getClientIP(request); + // 使用容器提供的连接地址,不从调用者可填写的转发头提取 IP。 + String clientIP = request.getRemoteAddr(); - // 允许 127.0.0.1 请求直接通过 - if (Ipv4Util.LOCAL_IP.equals(clientIP)) { + // 兼容 IPv4 回环不解析主机名。 + if (StrUtil.equalsAny(clientIP, Ipv4Util.LOCAL_IP)) { filterChain.doFilter(request, response); return; } String fromHeader = request.getHeader(SecurityConstants.FROM); - // 非 127.0.0.1 请求,没有配置 from header ,直接跳过 + // 普通请求不携带内部标记,交给后续认证与权限检查。 if (StrUtil.isBlank(fromHeader)) { filterChain.doFilter(request, response); return; } - // 非 127.0.0.1,配置了 from header ,直接拒绝访问 + // 外部连接或经过代理的请求,不允许自行声明为内部调用。 log.warn("请求 IP {},疑似进行系统注入操作,请注意", clientIP); response.setStatus(HttpStatus.FORBIDDEN.value()); }