Skip to content

Commit 8de3298

Browse files
authored
Merge pull request #319 from AikidoSec/fix/proxy-forwarded-ipv6-regex-perf
Avoid IPv6 regex on IPv4:port in ProxyForwardedParser.normalizeIp
2 parents c871109 + 5f9b47b commit 8de3298

2 files changed

Lines changed: 34 additions & 8 deletions

File tree

agent_api/src/main/java/dev/aikido/agent_api/helpers/net/ProxyForwardedParser.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,12 @@ private static String normalizeIp(String ip) {
5555

5656
ip = ip.trim();
5757

58-
if (IPValidator.isIP(ip)) {
59-
return ip;
58+
// Some proxies pass along port numbers with IPv4 addresses: ip:port
59+
if (ip.contains(":")) {
60+
String[] ipParts = ip.split(":");
61+
if (ipParts.length == 2 && IPValidator.isIP(ipParts[0], "4")) {
62+
return ipParts[0];
63+
}
6064
}
6165

6266
if (ip.startsWith("[") && ip.endsWith("]")) {
@@ -76,12 +80,8 @@ private static String normalizeIp(String ip) {
7680
}
7781
}
7882

79-
// Some proxies pass along port numbers with IP addresses :
80-
if (ip.contains(":")) {
81-
String[] ipParts = ip.split(":");
82-
if (ipParts.length == 2 && IPValidator.isIP(ipParts[0], "4")) {
83-
return ipParts[0];
84-
}
83+
if (IPValidator.isIP(ip)) {
84+
return ip;
8585
}
8686

8787
return null;

agent_api/src/test/java/helpers/ProxyForwardedParserTest.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,4 +214,30 @@ void testGetIpFromRequest_RawIpWithEmptyStringFallsBackToRawIp() {
214214
String result = getIpFromRequest("", new HashMap<>());
215215
assertEquals("", result);
216216
}
217+
218+
@Test
219+
void testGetIpFromRequest_IPv4WithMultiplePortColonsFallsBackToRawIp() {
220+
headers.put("X-Forwarded-For", List.of("1.2.3.4:80:90"));
221+
String result = getIpFromRequest("10.0.0.1", headers);
222+
assertEquals("10.0.0.1", result);
223+
}
224+
225+
@Test
226+
void testGetIpFromRequest_IPv4PortResolvesWithoutTouchingLaterEntries() {
227+
headers.put("X-Forwarded-For", List.of("203.0.113.7:54321, 8.8.8.8"));
228+
String result = getIpFromRequest("10.0.0.1", headers);
229+
assertEquals("203.0.113.7", result);
230+
}
231+
232+
@Test
233+
void testGetIpFromRequest_BracketedIPv4Resolves() {
234+
String result = getIpFromRequest("[1.2.3.4]", new HashMap<>());
235+
assertEquals("1.2.3.4", result);
236+
}
237+
238+
@Test
239+
void testGetIpFromRequest_BracketedIpWithTrailingGarbageFallsBackToRawIp() {
240+
String result = getIpFromRequest("[::1]foo", new HashMap<>());
241+
assertEquals("[::1]foo", result);
242+
}
217243
}

0 commit comments

Comments
 (0)