Im folgenden Tutorial zeigen wir Ihnen, wie Sie die Client-IP-Adresse mithilfe der Servlet-Spezifikation abrufen können. Wir besprechen, was Sie tun können, wenn sich Ihr Client hinter einem Proxy oder Gateway befindet. Wir erklären, warum diese IP-Adresse nicht immer sicher zu verwenden ist.
Client-IP-Adresse
In Java können Sie über Servlets request.getRemoteAddr()
auf die Client-IP-Adresse zugreifen.
String ipAddress = request.getRemoteAddr();
Aber diese Antwort ist alles andere als vollständig und ziemlich kompliziert.
Proxies, Gateways … zuverlässig, sicher?
Wenn Ihre Anwendung auf einem Webserver ausgeführt wird, der sich hinter einem Reverse Proxy oder Load Balancer befindet, kann dieser Proxy so konfiguriert werden, dass die angeforderte IP-Adresse in einen Anforderungsheader eingefügt wird. Verschiedene Reverse-Proxys können unterschiedliche Header injizieren. Konsultieren Sie die Dokumentation für Ihren Proxy-Server. Wir haben einige der am häufigsten verwendeten in unserem Beispiel unten aufgeführt, aber dies ist keineswegs eine vollständige Liste.
- Wenn Ihr Client einen (Weiterleitungs-) Proxy verwendet, werden möglicherweise Header eingefügt, um die IP-Adresse des Clients anzugeben. Oder es könnte nicht. Und die hier eingegebene IP-Adresse ist möglicherweise falsch.
- Dies bedeutet, dass der Wert, den Sie durch Aufrufen von
request.getRemoteAddr()
erhalten, die IP-Adresse der unmittelbaren Upstream-Quelle der Anforderung ist. - Wie gesagt, es werden viele Header für verschiedene Proxys verwendet, aber
x-forwareded-for
wird höchstwahrscheinlich von einem Proxy eingefügt.
Als letzte Anmerkung, selbst wenn Sie eine IP-Adresse entweder aus dem Header oder aus request.getRemoteAddr()
erhalten, ist nicht garantiert, dass es sich um die Client-IP-Adresse handelt. beispiel: Wenn Ihr Proxy nicht die IP-Adresse des Clients enthält, erhalten Sie die IP-Adresse des Proxys oder des Load Balancers. Wenn Ihr Client in einem privaten Netzwerk arbeitet und über ein NAT-Gateway eine Verbindung zum Internet herstellt, ist die IP-Adresse in der HTTP-Anforderung eine Adresse des NAT-Servers. Oder sogar für einen Hacker ist es ziemlich einfach, einen Header mit einer anderen IP-Adresse zu injizieren. Das bedeutet also, dass Sie die IP-Adresse des Systems, von dem die Anfrage stammt, nicht zuverlässig herausfinden können.
Client-IP-Adresse abrufen
private static final String IP_HEADER_CANDIDATES = { "X-Forwarded-For", "Proxy-Client-IP", "WL-Proxy-Client-IP", "HTTP_X_FORWARDED_FOR", "HTTP_X_FORWARDED", "HTTP_X_CLUSTER_CLIENT_IP", "HTTP_CLIENT_IP", "HTTP_FORWARDED_FOR", "HTTP_FORWARDED", "HTTP_VIA", "REMOTE_ADDR" };public static String getClientIpAddress(HttpServletRequest request) { for (String header : IP_HEADER_CANDIDATES) { String ip = request.getHeader(header); if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) { return ip; } } return request.getRemoteAddr();}