227 votes

Obtenir l'adresse IP du client en utilisant PHP

Je veux obtenir l'adresse IP du client qui utilise mon site web. J'utilise le programme PHP $_SERVER superglobal :

$_SERVER['REMOTE_ADDR'];

Mais je vois qu'il ne peut pas donner l'adresse IP correcte en utilisant ceci. J'obtiens mon adresse IP et je vois qu'elle est différente de mon adresse IP et je peux également voir mon adresse IP sur certains sites web comme :

http://whatismyipaddress.com/

Je colle l'adresse IP qui donne ma fonction PHP mais ce site web ne montre aucun résultat à ce sujet. Comment ce problème survient-il et comment puis-je obtenir l'adresse IP du client ?

5 votes

2 votes

Si vous êtes sur un serveur local, ce sera différent (par exemple : 192.168.xxx.xxx), car vous vérifiez auprès de whatsmyip que vous obtenez l'ip de votre isp qu'ils vous ont fourni.

0 votes

Sur votre ordinateur vous verrez votre IP privée (192...) et sur les sites web vous verrez votre IP publique (84...). En général, votre IP publique est la seule intéressante.

411voto

Sivanesh Govindan Points 522

La façon la plus simple d'obtenir le nom du visiteur/client Adresse IP utilise le $_SERVER['REMOTE_ADDR'] o $_SERVER['REMOTE_HOST'] variables.

Cependant, il arrive que cela ne renvoie pas l'adresse IP correcte du visiteur, nous pouvons donc utiliser d'autres variables du serveur pour obtenir l'adresse IP.

Les deux fonctions ci-dessous sont équivalentes, la différence résidant uniquement dans la manière et l'endroit où les valeurs sont récupérées.

getenv() est utilisé pour obtenir la valeur d'une variable d'environnement en PHP.

// Function to get the client IP address
function get_client_ip() {
    $ipaddress = '';
    if (getenv('HTTP_CLIENT_IP'))
        $ipaddress = getenv('HTTP_CLIENT_IP');
    else if(getenv('HTTP_X_FORWARDED_FOR'))
        $ipaddress = getenv('HTTP_X_FORWARDED_FOR');
    else if(getenv('HTTP_X_FORWARDED'))
        $ipaddress = getenv('HTTP_X_FORWARDED');
    else if(getenv('HTTP_FORWARDED_FOR'))
        $ipaddress = getenv('HTTP_FORWARDED_FOR');
    else if(getenv('HTTP_FORWARDED'))
       $ipaddress = getenv('HTTP_FORWARDED');
    else if(getenv('REMOTE_ADDR'))
        $ipaddress = getenv('REMOTE_ADDR');
    else
        $ipaddress = 'UNKNOWN';
    return $ipaddress;
}

$_SERVER est un tableau qui contient des variables de serveur créées par le serveur web.

// Function to get the client IP address
function get_client_ip() {
    $ipaddress = '';
    if (isset($_SERVER['HTTP_CLIENT_IP']))
        $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
    else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
        $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
    else if(isset($_SERVER['HTTP_X_FORWARDED']))
        $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
    else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
        $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
    else if(isset($_SERVER['HTTP_FORWARDED']))
        $ipaddress = $_SERVER['HTTP_FORWARDED'];
    else if(isset($_SERVER['REMOTE_ADDR']))
        $ipaddress = $_SERVER['REMOTE_ADDR'];
    else
        $ipaddress = 'UNKNOWN';
    return $ipaddress;
}

42 votes

Notez que cette fonction peut également vous mener très loin. En particulier, HTTP_X_FORWARDED_FOR peut être tout ce qu'un client choisit de définir, alors que REMOTE_ADDR est considérablement plus difficile à falsifier, si le client veut obtenir la réponse réelle.

3 votes

De plus, même si elle n'est pas truquée, il existe de nombreuses configurations où elle sera simplement remplie avec l'ip du réseau interne du client, ce qui serait inutile.

4 votes

Ce code est vulnérable à l'usurpation d'identité, faites attention où vous l'utilisez !

141voto

Michael Points 1009

En PHP 5.3 ou plus, vous pouvez l'obtenir comme ceci :

$ip = getenv('HTTP_CLIENT_IP')?:
getenv('HTTP_X_FORWARDED_FOR')?:
getenv('HTTP_X_FORWARDED')?:
getenv('HTTP_FORWARDED_FOR')?:
getenv('HTTP_FORWARDED')?:
getenv('REMOTE_ADDR');

2 votes

Cela a fonctionné pour moi, alors que celui qui était marqué comme la bonne réponse ne l'était pas.

1 votes

Est getenv mieux que d'utiliser $_SERVER ?

9 votes

Getenv renvoie un false si la variable n'est pas définie, où $_SERVER affichera une erreur avec "undefined index" si la variable n'est pas définie.

1voto

Rene Berwanger Points 29
    $ipaddress = '';
    if ($_SERVER['HTTP_CLIENT_IP'] != '127.0.0.1')
        $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
    else if ($_SERVER['HTTP_X_FORWARDED_FOR'] != '127.0.0.1')
        $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
    else if ($_SERVER['HTTP_X_FORWARDED'] != '127.0.0.1')
        $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
    else if ($_SERVER['HTTP_FORWARDED_FOR'] != '127.0.0.1')
        $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
    else if ($_SERVER['HTTP_FORWARDED'] != '127.0.0.1')
        $ipaddress = $_SERVER['HTTP_FORWARDED'];
    else if ($_SERVER['REMOTE_ADDR'] != '127.0.0.1')
        $ipaddress = $_SERVER['REMOTE_ADDR'];
    else
        $ipaddress = 'UNKNOWN';

0voto

Les réponses données jusqu'à présent échouent si l'on accède à un site web par l'intermédiaire de HTTPS . L'article de Stack Overflow Besoin de l'adresse IP du client lors de l'accès HTTPS domain.com a l'un des scénarios.

-18voto

rohitarora Points 449

Voici une fonction permettant d'obtenir l'adresse IP en utilisant un filtre pour les adresses IP locales et LAN :

function get_IP_address()
{
    foreach (array('HTTP_CLIENT_IP',
                   'HTTP_X_FORWARDED_FOR',
                   'HTTP_X_FORWARDED',
                   'HTTP_X_CLUSTER_CLIENT_IP',
                   'HTTP_FORWARDED_FOR',
                   'HTTP_FORWARDED',
                   'REMOTE_ADDR') as $key){
        if (array_key_exists($key, $_SERVER) === true){
            foreach (explode(',', $_SERVER[$key]) as $IPaddress){
                $IPaddress = trim($IPaddress); // Just to be safe

                if (filter_var($IPaddress,
                               FILTER_VALIDATE_IP,
                               FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)
                    !== false) {

                    return $IPaddress;
                }
            }
        }
    }
}

37 votes

0 votes

code function getLocalIP(){ exec("ipconfig /all", $output) ; foreach($output as $line){ if (preg_match("/(.*)IPv4 Address(.*)/", $line)){ $ip = $line ; $ip = str_replace("IPv4 Address. . . . . . . . . :","",$ip) ; $ip = str_replace("(Preferred)","",$ip) ; } } return trim($ip) ; }

1 votes

Tant de signaux négatifs, mais seule cette réponse contient FILTER_VALIDATE_IP qui peut être un problème de sécurité majeur s'il n'est pas filtré.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X