Comment obtenir l'@ IP des utilisateurs distants d'une Servlet?
Résolu/Fermé
chercheur2017
Messages postés
56
Date d'inscription
mardi 18 avril 2017
Statut
Membre
Dernière intervention
16 décembre 2018
-
Modifié le 3 juil. 2017 à 18:34
chercheur2017 Messages postés 56 Date d'inscription mardi 18 avril 2017 Statut Membre Dernière intervention 16 décembre 2018 - 4 juil. 2017 à 14:32
chercheur2017 Messages postés 56 Date d'inscription mardi 18 avril 2017 Statut Membre Dernière intervention 16 décembre 2018 - 4 juil. 2017 à 14:32
A voir également:
- Comment obtenir l'@ IP des utilisateurs distants d'une Servlet?
- Ethernet n'a pas de configuration ip valide - Guide
- Comment savoir si quelqu'un utilise mon adresse ip - Guide
- Comment connaître son adresse ip - Guide
- Comment utiliser chromecast - Guide
- Ip local - Guide
1 réponse
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
3 juil. 2017 à 20:21
3 juil. 2017 à 20:21
Bonjour,
On a déjà eu cette discussion il y a deux mois :
Comment obtenir l'@ IP d'un client de service web en Java?
J'ajouterais en plus :
1) les headers sont facultatifs donc rien ne garantie que les adresses IP soit effectivement présentes dans les headers
2) les headers peuvent être modifiés par le client ou n'importe quel élément réseau intermédiaire, donc sa valeur n'est pas fiable
3) on peut avoir plusieurs fois le même header avec des valeurs différentes
4) un header peut contenir une adresse IP mélangée avec d'autres informations (parfois d'autres adresses IP).
Le mieux serait donc d'aller regarder tous les headers et enregistrer tout ceux qui contiennent une adresse IP.
À ces résultats on rajoute ceux de getRemoteAddr() et getRemoteHost() qui sont à peu près les seuls que tu es sûr d'avoir bien que leur valeur ne représente rarement le client final mais plutôt le dernier élément réseau avec lequel tu discutes (un proxy par exemple).
On a déjà eu cette discussion il y a deux mois :
Comment obtenir l'@ IP d'un client de service web en Java?
InetAddress.getLocalHost()c'est faux, ça va te renvoyer l'adresse IP de ton serveur, pas du client.
request.getHeader("X-FORWARDED-FOR");est mieux, même s'il est à noter qu'il peut contenir plusieurs adresses IP, et que d'autres adresses IP peuvent se trouver dans d'autres headers.
J'ajouterais en plus :
1) les headers sont facultatifs donc rien ne garantie que les adresses IP soit effectivement présentes dans les headers
2) les headers peuvent être modifiés par le client ou n'importe quel élément réseau intermédiaire, donc sa valeur n'est pas fiable
3) on peut avoir plusieurs fois le même header avec des valeurs différentes
4) un header peut contenir une adresse IP mélangée avec d'autres informations (parfois d'autres adresses IP).
Le mieux serait donc d'aller regarder tous les headers et enregistrer tout ceux qui contiennent une adresse IP.
À ces résultats on rajoute ceux de getRemoteAddr() et getRemoteHost() qui sont à peu près les seuls que tu es sûr d'avoir bien que leur valeur ne représente rarement le client final mais plutôt le dernier élément réseau avec lequel tu discutes (un proxy par exemple).
public static void addIpAddress(String name, String header, Map<String, Set<String>> map) { if (name != null && header != null && header.matches("(\\p{Digit}+\\.){3}\\p{Digit}" + "|(\\p{XDigit}+:){7}\\p{XDigit}+")) { Set<String> ips = map.get(name); if (ips == null) { ips = new TreeSet<>(); map.put(name, ips); } ips.add(header); } } @SuppressWarnings("unchecked") public static Map<String, Set<String>> parseIpHeaders(HttpServletRequest request) { Map<String, Set<String>> result = new TreeMap<>(); Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String name = headerNames.nextElement(); Enumeration<String> headerValues = request.getHeaders(name); while (headerValues.hasMoreElements()) { addIpAddress(name, headerValues.nextElement(), result); } } addIpAddress("REMOTE_ADDR", request.getRemoteAddr(), result); addIpAddress("REMOTE_HOST", request.getRemoteHost(), result); return result; }
4 juil. 2017 à 13:04
C'est bon, j'ai réglé le problème. La requête passait par un port intermédiaire qui ne renvoyait pas l'adresse voulue. J'ai changé de port et ça marche très bien. Mais, il me reste un petit problème concernant la fonction "getRemoteHost()" qui me retourne aussi l'adresse IP et pas le nom de la machine!!!
NB:
Concernant request.getHeader("X-FORWARDED-FOR"), alors cella elle me retourne une valeur "null"!!
Merci encore KX pour ta disponibilité.
4 juil. 2017 à 13:19
Il y a juste un format normalisé qui permet d'en extraire des valeurs spéciales (les headers, les cookies...) mais c'est tout, sinon chacun fait ce qu'il veut.
request.getHeader("X-FORWARDED-FOR"), alors cella elle me retourne une valeur "null"
Voir ma remarque 1 : les header sont optionnels
"getRemoteHost()" qui me retourne aussi l'adresse IP et pas le nom de la machine
Voir ma remarque 2 : la valeur d'un header n'est pas fiable.
Remarque : il est toujours possible de filtrer les requêtes et refuser celles qui ne contiennent pas les valeurs que tu attends...
4 juil. 2017 à 14:32