108 votes

Comment obtenir l'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 l'adresse IP réelle des visiteurs. lorsqu'ils utilisent un proxy . Existe-t-il un moyen d'obtenir l'adresse IP d'un visiteur dans ce cas ?

4voto

Ehsan Chavoshi Points 21

C'est ma fonction.

avantages :

  • Fonctionne si $_SERVER n'était pas disponible.
  • Filtrer les IP privées et/ou réservées ;
  • Traiter toutes les IP transférées dans X_FORWARDED_FOR
  • Compatible avec CloudFlare
  • Peut définir une valeur par défaut si aucune IP valide n'est trouvée !
  • Court et 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;
}

1voto

Nick Tsai Points 1217

Si le Proxy est celui auquel vous faites confiance, vous pouvez essayer : (Supposons que l'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 empêchera les clients qui demandent des informations directes de falsifier l'en-tête de transmission et d'obtenir l'adresse IP réelle par l'intermédiaire de mandataires de confiance.

-1voto

Nelson Points 19623

Oui, $_SERVER["HTTP_X_FORWARDED_FOR"] est la façon dont je vois mon IP lorsque je suis sous un proxy sur mon serveur nginx.

Mais votre meilleure chance est d'exécuter phpinfo() sur une page demandée à partir d'un proxy afin que vous puissiez regarder toutes les variables disponibles et voir quelle est celle qui porte votre véritable IP.

-2voto

Khaled Alam Points 5

Méthode simple

Código: PHP

<?php

echo $_SERVER["REMOTE_ADDR"]; 

?> 

Résultat :

ex : 41.40.147.148

\==> Note ne fonctionne pas sur Localhost. Vous devez télécharger l'index sur un hôte en ligne...

-6voto

Valcone Points 59

Cela fonctionne pour Windows et Linux ! Peu importe si c'est localhost ou online..

    function getIP() {
    $ip = $_SERVER['SERVER_ADDR'];

    if (PHP_OS == 'WINNT'){
        $ip = getHostByName(getHostName());
    }

    if (PHP_OS == 'Linux'){
        $command="/sbin/ifconfig";
        exec($command, $output);
        // var_dump($output);
        $pattern = '/inet addr:?([^ ]+)/';

        $ip = array();
        foreach ($output as $key => $subject) {
            $result = preg_match_all($pattern, $subject, $subpattern);
            if ($result == 1) {
                if ($subpattern[1][0] != "127.0.0.1")
                $ip = $subpattern[1][0];
            }
        //var_dump($subpattern);
        }
    }
    return $ip;
}

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