web-dev-qa-db-fra.com

quelle est la bonne façon d'obtenir l'ip de demande

Je trouve différentes façons d'obtenir ip dans servlet. mais je ne sais pas lequel a raison et pourquoi.

1:

request.getHeader( "X-Real-IP" )

2:

  String ip = request.getHeader("X-Forwarded-For"); 
  if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("Proxy-Client-IP");  
    }  
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("WL-Proxy-Client-IP");  
    }  
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("HTTP_CLIENT_IP");  
    }  
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("HTTP_X_FORWARDED_FOR");  
    }  
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getRemoteAddr();  
    } `

3:

 String ip=request.getHeader("x-forwarded-for");
                if(ip==null){
                    ip=request.getRemoteAddr();
                }
                String ips[]=ip.split(",");`
                                ip=ips[0];
24
sprite

La réponse est compliquée.

  • Si votre servlet s'exécute sur un serveur Web qui se trouve derrière un proxy inverse ou un équilibreur de charge, ce proxy Web peut être configuré pour injecter un en-tête de demande qui donne l'adresse IP d'où provient la demande. Différents proxys inversés injecteront des en-têtes différents. Consultez la documentation de votre serveur (frontal).

  • Si votre client utilise un proxy (direct), il pourrait insérer des en-têtes pour dire quelle est l'adresse IP du client ... ou il pourrait ne pas l'être. Et l'adresse IP qu'il insère pourrait être incorrecte.

  • La valeur que vous obtenez en appelant request.getRemoteAddr() va être l'adresse IP de la source amont immédiate de la requête.

Aucun des en-têtes que vous avez répertoriés n'est standard, mais "x-forwarded-for" est réputé être un standard de facto; c'est-à-dire que c'est celui qui est le plus susceptible d'être inséré par un proxy, etc ... si quelque chose est injecté.

Enfin, même si vous avez obtenu une adresse IP, cela ne vous aidera pas nécessairement. Par exemple, si le client se trouve sur un réseau privé et se connecte à Internet via une passerelle NAT, alors l'adresse IP dans la requête HTTP sera une adresse de NAT serveur ... pas l'adresse IP réelle du client.


Alors que veut dire tout cela? Eh bien, fondamentalement, cela signifie que en général vous ne pouvez pas de manière fiable trouver l'adresse IP du système d'où provient la demande.

53
Stephen C

Cela semble le plus que nous pouvons faire pour obtenir l'adresse IP d'origine du client

String ipAddress = request.getHeader("X-FORWARDED-FOR");  
if (ipAddress == null) {  
   ipAddress = request.getRemoteAddr();  
}
15
Burak Keceli