Nel seguente tutorial vi mostreremo come è possibile ottenere l’indirizzo IP del client utilizzando le specifiche servlet. Discutiamo cosa puoi fare se il tuo cliente è dietro un proxy o un gateway. Spieghiamo perché questo indirizzo IP non è sempre sicuro da usare.
Indirizzo IP del client
In java è possibile accedere all’indirizzo IP del client tramite servlet request.getRemoteAddr()
.
String ipAddress = request.getRemoteAddr();
Ma questa risposta è tutt’altro che completa ed è piuttosto complicata.
Proxy, gateway reliable affidabile, sicuro?
Se l’applicazione è in esecuzione su un server Web che si trova dietro un proxy inverso o un bilanciamento del carico, allora quel proxy può essere configurato per iniettare l’indirizzo IP richiesto in un’intestazione di richiesta. Diversi proxy inversi possono iniettare intestazioni diverse. Consultare la documentazione del server proxy. Abbiamo elencato un paio dei più utilizzati nel nostro esempio qui sotto, ma questo non è affatto un elenco completo.
- Quando il client utilizza un proxy (forward), potrebbe inserire intestazioni per indicare quali sono gli indirizzi IP del client. O forse no. E l’indirizzo IP inserito qui potrebbe essere errato.
- Ciò significa che il valore che si ottiene chiamando
request.getRemoteAddr()
è l’indirizzo IP dell’origine upstream immediata della richiesta. - Come abbiamo detto, ci sono molte intestazioni per diversi proxy in uso, ma è più probabile che
x-forwareded-for
venga inserito da un proxy.
Come ultima nota, anche se si ottiene un indirizzo IP dall’intestazione o da request.getRemoteAddr()
non è garantito essere l’indirizzo IP del client. ad esempio: se il tuo proxy non include l’indirizzo IP del client, otterrai l’indirizzo IP del proxy o del bilanciamento del carico. Se il client funziona su una rete privata e si connette a Internet tramite un gateway NAT, l’indirizzo IP nella richiesta HTTP sarà un indirizzo del server NAT. O anche per un hacker è abbastanza facile iniettare un’intestazione con un indirizzo IP diverso. Quindi questo significa che non è possibile trovare in modo affidabile l’indirizzo IP del sistema da cui ha avuto origine la richiesta.
Ottieni l’indirizzo IP del client
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();}