Skip to content

Commit 8917cdb

Browse files
committed
Improve Performance of IPv4 Check
Closes gh-15324
1 parent 4fc22a4 commit 8917cdb

File tree

1 file changed

+8
-9
lines changed

1 file changed

+8
-9
lines changed

web/src/main/java/org/springframework/security/web/util/matcher/IpAddressMatcher.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
import java.net.InetAddress;
2020
import java.net.UnknownHostException;
21-
import java.util.Scanner;
21+
import java.util.regex.Pattern;
2222

2323
import jakarta.servlet.http.HttpServletRequest;
2424

@@ -37,6 +37,8 @@
3737
*/
3838
public final class IpAddressMatcher implements RequestMatcher {
3939

40+
private static Pattern IPV4 = Pattern.compile("\\d{0,3}.\\d{0,3}.\\d{0,3}.\\d{0,3}(/\\d{0,3})?");
41+
4042
private final int nMaskBits;
4143

4244
private final InetAddress requiredAddress;
@@ -93,16 +95,13 @@ public boolean matches(String address) {
9395
}
9496

9597
private void assertNotHostName(String ipAddress) {
98+
boolean isIpv4 = IPV4.matcher(ipAddress).matches();
99+
if (isIpv4) {
100+
return;
101+
}
96102
String error = "ipAddress " + ipAddress + " doesn't look like an IP Address. Is it a host name?";
97103
Assert.isTrue(ipAddress.charAt(0) == '[' || ipAddress.charAt(0) == ':'
98-
|| Character.digit(ipAddress.charAt(0), 16) != -1, error);
99-
if (!ipAddress.contains(":")) {
100-
Scanner parts = new Scanner(ipAddress);
101-
parts.useDelimiter("[./]");
102-
while (parts.hasNext()) {
103-
Assert.isTrue(parts.hasNextInt() && parts.nextInt() >> 8 == 0, error);
104-
}
105-
}
104+
|| (Character.digit(ipAddress.charAt(0), 16) != -1 && ipAddress.contains(":")), error);
106105
}
107106

108107
private InetAddress parseAddress(String address) {

0 commit comments

Comments
 (0)