în tutorialul următor Vă vom arăta cum puteți obține adresa IP a clientului folosind specificația servlet. Discutăm ce puteți face dacă clientul dvs. se află în spatele unui proxy sau gateway. Vă explicăm de ce această adresă IP nu este întotdeauna sigură de utilizat.
adresa IP a clientului
în java puteți accesa adresa IP a Clientului prin servletul request.getRemoteAddr()
.
String ipAddress = request.getRemoteAddr();
dar acest răspuns este departe de a fi complet și este destul de complicat.
proxy-uri, Gateway-uri … fiabile, sigure?
dacă aplicația dvs. rulează pe un server web care se află în spatele unui proxy invers sau al unui Balancer de încărcare, atunci acel proxy poate fi configurat pentru a injecta adresa IP solicitată într-un antet de solicitare. Diferite proxy-uri inverse pot injecta anteturi diferite. Consultați documentația pentru serverul proxy. Am enumerat câteva dintre cele mai utilizate în exemplul nostru de mai jos, dar aceasta nu este în niciun caz o listă completă.
- când clientul dvs. utilizează un proxy (forward), atunci s-ar putea insera anteturi pentru a spune ce este adresa IP a clientului. Sau s-ar putea să nu fie. Și adresa IP introdusă aici ar putea fi incorectă.
- aceasta înseamnă că valoarea pe care o obțineți apelând
request.getRemoteAddr()
este adresa IP a sursei imediate din amonte a solicitării. - după cum am spus, Există multe anteturi pentru diferite proxy-uri utilizate, dar
x-forwareded-for
este cel mai probabil să fie inserat de un proxy.
ca o ultimă notă, chiar dacă obțineți o adresă IP fie din antet, fie din request.getRemoteAddr()
nu este garantat să fie adresa IP a clientului. de exemplu: dacă proxy-ul dvs. nu include adresa IP a clientului, atunci veți obține adresa IP a proxy-ului sau a balancerului de încărcare. Dacă clientul dvs. funcționează într-o rețea privată și se conectează la internet printr-un gateway NAT, atunci adresa IP din solicitarea HTTP va fi o adresă a serverului nat. Sau chiar și pentru un hacker este destul de ușor să injectați un antet cu o altă adresă IP. Deci, aceasta înseamnă că nu puteți afla în mod fiabil adresa IP a sistemului de la care a provenit solicitarea.
obțineți adresa IP a clientului
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();}