From bf305927129bb3c8735512818501eaac1eab38bd Mon Sep 17 00:00:00 2001 From: wenshao Date: Wed, 12 Sep 2018 20:32:40 +0800 Subject: [PATCH] bug fixed for getRemoteAddress. --- .../support/http/stat/WebSessionStat.java | 1 - .../com/alibaba/druid/util/DruidWebUtils.java | 35 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/alibaba/druid/support/http/stat/WebSessionStat.java b/src/main/java/com/alibaba/druid/support/http/stat/WebSessionStat.java index 5b868db802..8e4514977d 100644 --- a/src/main/java/com/alibaba/druid/support/http/stat/WebSessionStat.java +++ b/src/main/java/com/alibaba/druid/support/http/stat/WebSessionStat.java @@ -262,7 +262,6 @@ public class WebSessionStat { } if (remoteAddresses.length() > 256) { - LOG.error("session ip change too many"); return; } diff --git a/src/main/java/com/alibaba/druid/util/DruidWebUtils.java b/src/main/java/com/alibaba/druid/util/DruidWebUtils.java index b4d0af59b0..567a3f20fa 100644 --- a/src/main/java/com/alibaba/druid/util/DruidWebUtils.java +++ b/src/main/java/com/alibaba/druid/util/DruidWebUtils.java @@ -23,19 +23,54 @@ public class DruidWebUtils { public static String getRemoteAddr(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); + if (ip != null && !isValidAddress(ip)) { + ip = null; + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); + if (ip != null && !isValidAddress(ip)) { + ip = null; + } } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); + if (ip != null && !isValidAddress(ip)) { + ip = null; + } } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); + if (ip != null && !isValidAddress(ip)) { + ip = null; + } } return ip; } + private static boolean isValidAddress(String ip) { + if (ip == null) { + return false; + } + + for (int i = 0; i < ip.length(); ++i) { + char ch = ip.charAt(i); + if (ch >= '0' && ch <= '9') { + } else if (ch >= 'A' && ch <= 'F') { + } else if (ch >= 'a' && ch <= 'f') { + } else if (ch == '.' || ch == ':') { + // + } else { + return false; + } + } + + return true; + } + private static String getContextPath_2_5(ServletContext context) { String contextPath = context.getContextPath();