web-dev-qa-db-fra.com

Comment obtenir une adresse IP réelle d'un visiteur?

J'utilise ce code PHP pour obtenir l'adresse IP d'un visiteur:

<?php echo $_SERVER['REMOTE_ADDR']; ?>

Mais, je ne peux pas obtenir la véritable adresse IP des visiteurs quand ils utilisent un proxy. Est-il possible d'obtenir l'adresse IP d'un visiteur dans ce cas?

84
user1866412

Essayez ce code php.

<?PHP

function getUserIP()
{
    // Get real visitor IP behind CloudFlare network
    if (isset($_SERVER["HTTP_CF_CONNECTING_IP"])) {
              $_SERVER['REMOTE_ADDR'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
              $_SERVER['HTTP_CLIENT_IP'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
    }
    $client  = @$_SERVER['HTTP_CLIENT_IP'];
    $forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
    $remote  = $_SERVER['REMOTE_ADDR'];

    if(filter_var($client, FILTER_VALIDATE_IP))
    {
        $ip = $client;
    }
    elseif(filter_var($forward, FILTER_VALIDATE_IP))
    {
        $ip = $forward;
    }
    else
    {
        $ip = $remote;
    }

    return $ip;
}


$user_ip = getUserIP();

echo $user_ip; // Output IP address [Ex: 177.87.193.134]


?>
156
user1866400

C'est la technique la plus courante que j'ai vue:

function getUserIP() {
    if( array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER) && !empty($_SERVER['HTTP_X_FORWARDED_FOR']) ) {
        if (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',')>0) {
            $addr = explode(",",$_SERVER['HTTP_X_FORWARDED_FOR']);
            return trim($addr[0]);
        } else {
            return $_SERVER['HTTP_X_FORWARDED_FOR'];
        }
    }
    else {
        return $_SERVER['REMOTE_ADDR'];
    }
}

Notez que cela ne garantit pas que vous obtiendrez toujours l'adresse IP de l'utilisateur car il existe de nombreuses façons de la masquer.

40
Teneff

Ceci est mon approche:

 function getRealUserIp(){
    switch(true){
      case (!empty($_SERVER['HTTP_X_REAL_IP'])) : return $_SERVER['HTTP_X_REAL_IP'];
      case (!empty($_SERVER['HTTP_CLIENT_IP'])) : return $_SERVER['HTTP_CLIENT_IP'];
      case (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) : return $_SERVER['HTTP_X_FORWARDED_FOR'];
      default : return $_SERVER['REMOTE_ADDR'];
    }
 }

Comment utiliser:

$ip = getRealUserIp();
19
El cero

Les mandataires peuvent envoyer un en-tête HTTP_X_FORWARDED_FOR mais cela reste facultatif.

N'oubliez pas non plus que les visiteurs peuvent partager des adresses IP. Les réseaux universitaires, les grandes entreprises et les FAI du tiers monde/à petit budget ont tendance à partager les adresses IP entre de nombreux utilisateurs.

7
Halcyon

appliquer ce code pour obtenir l'adresse ip:

    if (getenv('HTTP_X_FORWARDED_FOR')) { $pipaddress = getenv('HTTP_X_FORWARDED_FOR');
 $ipaddress = getenv('REMOTE_ADDR'); 
    echo "Your Proxy IP address is : ".$pipaddress. "(via $ipaddress)" ; } 
    else { $ipaddress = getenv('REMOTE_ADDR'); echo "Your IP address is : $ipaddress"; }
    ------------------------------------------------------------------------
5
Yogesh Prajapati

Ceci est ma fonction.

avantages :

  • Fonctionne si $ _SERVER n’est pas disponible.
  • Filtrer les adresses IP privées et/ou réservées;
  • Traiter toutes les adresses IP transférées dans X_FORWARDED_FOR
  • Compatible avec CloudFlare
  • Peut définir une valeur par défaut si aucune adresse IP valide trouvée!
  • Court & Simple!

/**
 * Get real user ip
 *
 * Usage sample:
 * GetRealUserIp();
 * GetRealUserIp('ERROR',FILTER_FLAG_NO_RES_RANGE);
 * 
 * @param string $default default return value if no valid ip found
 * @param int    $filter_options filter options. default is FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE
 *
 * @return string real user ip
 */

function GetRealUserIp($default = NULL, $filter_options = 12582912) {
    $HTTP_X_FORWARDED_FOR = isset($_SERVER)? $_SERVER["HTTP_X_FORWARDED_FOR"]:getenv('HTTP_X_FORWARDED_FOR');
    $HTTP_CLIENT_IP = isset($_SERVER)?$_SERVER["HTTP_CLIENT_IP"]:getenv('HTTP_CLIENT_IP');
    $HTTP_CF_CONNECTING_IP = isset($_SERVER)?$_SERVER["HTTP_CF_CONNECTING_IP"]:getenv('HTTP_CF_CONNECTING_IP');
    $REMOTE_ADDR = isset($_SERVER)?$_SERVER["REMOTE_ADDR"]:getenv('REMOTE_ADDR');

    $all_ips = explode(",", "$HTTP_X_FORWARDED_FOR,$HTTP_CLIENT_IP,$HTTP_CF_CONNECTING_IP,$REMOTE_ADDR");
    foreach ($all_ips as $ip) {
        if ($ip = filter_var($ip, FILTER_VALIDATE_IP, $filter_options))
            break;
    }
    return $ip?$ip:$default;
}
4
Ehsan Chavoshi

Si vous avez confiance dans le proxy, vous pouvez essayer: (en supposant que l'adresse IP du proxy est 151.101.2.10)

<?php

$trustProxyIPs = ['151.101.2.10'];

$clientIP  = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : NULL;

if (in_array($clientIP, $trustProxyIPs)) {

    $headers = ['HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR'];

    foreach ($headers as $key => $header) {

        if (isset($_SERVER[$header]) && filter_var($_SERVER[$header], FILTER_VALIDATE_IP)) {

            $clientIP = $_SERVER[$header];

            break;
        }
    }
}

echo $clientIP;

Cela évitera les en-têtes de transfert forgés par les clients directement sollicités et permettra d'obtenir une adresse IP réelle via des proxies de confiance.

1
Nick Tsai

Oui, $_SERVER["HTTP_X_FORWARDED_FOR"] est ainsi que je vois mon adresse IP sous un proxy sur mon serveur nginx.

Mais votre meilleur pari est de lancer phpinfo() sur une page demandée sous un proxy afin que vous puissiez consulter toutes les variables disponibles et voir quelle est celle qui contient votre adresse IP réelle.

0
Nelson