Comment obtenir l'adresse IP du client en PHP?


Answers

$_SERVER['REMOTE_ADDR'] peut ne pas contenir d'adresses IP de clients réels, car il vous donnera une adresse proxy pour les clients connectés via un proxy, par exemple. Cela pourrait bien être ce que vous voulez vraiment, en fonction de ce que vous faites avec les IP. L'adresse RFC1918 privée de quelqu'un peut ne pas vous faire du bien si vous dites, en essayant de voir d'où votre trafic provient, ou en se rappelant de quelle IP l'utilisateur s'est connecté en dernier, où l'IP public du proxy ou de la passerelle NAT approprié pour stocker.

Il existe plusieurs en-têtes HTTP comme X-Forwarded-For qui peuvent être définis ou non par divers proxy. Le problème est que ce sont simplement des en-têtes HTTP qui peuvent être définis par n'importe qui. Il n'y a aucune garantie sur leur contenu. $_SERVER['REMOTE_ADDR'] est l'adresse IP physique réelle à partir de laquelle le serveur Web a reçu la connexion et à laquelle la réponse sera envoyée. Tout le reste n'est que de l'information arbitraire et volontaire. Il existe un seul scénario dans lequel vous pouvez faire confiance à cette information: vous contrôlez le proxy qui définit cet en-tête. Ce qui signifie que si vous savez 100% où et comment l'en-tête a été défini, vous devez le tenir compte de tout ce qui est important.

Cela dit, voici un exemple de code:

if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}

Note de l'éditeur: L' utilisation du code ci-dessus a des implications de sécurité . Le client peut définir toutes les informations d'en-tête HTTP (par exemple $_SERVER['HTTP_... ) à n'importe quelle valeur arbitraire qu'il veut. En tant que tel, il est beaucoup plus fiable d'utiliser $_SERVER['REMOTE_ADDR'] , car cela ne peut pas être défini par l'utilisateur.

De: http://roshanbh.com.np/2007/12/getting-real-ip-address-in-php.html

Question

Comment puis-je obtenir l'adresse IP du client en utilisant PHP?

Je veux garder trace de l'utilisateur qui s'est connecté à mon site Web via son adresse IP.




Comme ça????

if(($ip=filter_input(INPUT_SERVER,'REMOTE_ADDR',validate_ip))===false or empty($ip)){
  exit;
  }
echo $ip;

PS

if(($ip=filter_input(INPUT_SERVER,'REMOTE_ADDR',FILTER_VALIDATE_IP|FILTER_FLAG_NO_PRIV_RANGE|FILTER_FLAG_NO_RES_RANGE))===false){
  header('HTTP/1.0 400 Bad Request');
  exit;
}

Tous les en-têtes commençant par 'HTTP_' ou 'X-' peuvent être spoofs respectivement définis par l'utilisateur. Si vous voulez garder la trace, utilisez des cooies, etc.




Cette fonction est compacte et vous pouvez l'utiliser partout. Mais !

N'oublie pas ça! Dans ce type, les fonctions ou les blocs de code ne garantissent pas l'enregistrement de l'adresse IP réelle de l'utilisateur car certains utilisateurs peuvent utiliser un proxy ou une autre passerelle de manière sécurisée pour être invisibles ou ne peuvent pas suivre

Fonction Php:

function GetIP()
{
    if ( getenv("HTTP_CLIENT_IP") ) {
        $ip = getenv("HTTP_CLIENT_IP");
    } elseif ( getenv("HTTP_X_FORWARDED_FOR") ) {
        $ip = getenv("HTTP_X_FORWARDED_FOR");
        if ( strstr($ip, ',') ) {
            $tmp = explode(',', $ip);
            $ip = trim($tmp[0]);
        }
    } else {
        $ip = getenv("REMOTE_ADDR");
    }
    return $ip;
}

Utilisation:

$IP = GetIP(); ou directement GetIP();




 $_SERVER['REMOTE_ADDR'];

essaye celui-là




Ma solution préférée est la façon dont Zend Framework 2 utilise. Il considère également les propriétés $_SERVER HTTP_X_FORWARDED_FOR , HTTP_CLIENT_IP , REMOTE_ADDR mais il déclare une classe pour qu'il définisse des proxies de confiance et renvoie une adresse IP et non un tableau. Je pense que c'est la solution qui s'en rapproche le plus:

class RemoteAddress
{
    /**
     * Whether to use proxy addresses or not.
     *
     * As default this setting is disabled - IP address is mostly needed to increase
     * security. HTTP_* are not reliable since can easily be spoofed. It can be enabled
     * just for more flexibility, but if user uses proxy to connect to trusted services
     * it's his/her own risk, only reliable field for IP address is $_SERVER['REMOTE_ADDR'].
     *
     * @var bool
     */
    protected $useProxy = false;

    /**
     * List of trusted proxy IP addresses
     *
     * @var array
     */
    protected $trustedProxies = array();

    /**
     * HTTP header to introspect for proxies
     *
     * @var string
     */
    protected $proxyHeader = 'HTTP_X_FORWARDED_FOR';

    // [...]

    /**
     * Returns client IP address.
     *
     * @return string IP address.
     */
    public function getIpAddress()
    {
        $ip = $this->getIpAddressFromProxy();
        if ($ip) {
            return $ip;
        }

        // direct IP address
        if (isset($_SERVER['REMOTE_ADDR'])) {
            return $_SERVER['REMOTE_ADDR'];
        }

        return '';
    }

    /**
     * Attempt to get the IP address for a proxied client
     *
     * @see http://tools.ietf.org/html/draft-ietf-appsawg-http-forwarded-10#section-5.2
     * @return false|string
     */
    protected function getIpAddressFromProxy()
    {
        if (!$this->useProxy
            || (isset($_SERVER['REMOTE_ADDR']) && !in_array($_SERVER['REMOTE_ADDR'], $this->trustedProxies))
        ) {
            return false;
        }

        $header = $this->proxyHeader;
        if (!isset($_SERVER[$header]) || empty($_SERVER[$header])) {
            return false;
        }

        // Extract IPs
        $ips = explode(',', $_SERVER[$header]);
        // trim, so we can compare against trusted proxies properly
        $ips = array_map('trim', $ips);
        // remove trusted proxy IPs
        $ips = array_diff($ips, $this->trustedProxies);

        // Any left?
        if (empty($ips)) {
            return false;
        }

        // Since we've removed any known, trusted proxy servers, the right-most
        // address represents the first IP we do not know about -- i.e., we do
        // not know if it is a proxy server, or a client. As such, we treat it
        // as the originating IP.
        // @see http://en.wikipedia.org/wiki/X-Forwarded-For
        $ip = array_pop($ips);
        return $ip;
    }

    // [...]
}

Voir le code complet ici: https://raw.githubusercontent.com/zendframework/zend-http/master/src/PhpEnvironment/RemoteAddress.php




J'aime ce code:

function getClientIP() {

    if (isset($_SERVER)) {

        if (isset($_SERVER["HTTP_X_FORWARDED_FOR"]))
            return $_SERVER["HTTP_X_FORWARDED_FOR"];

        if (isset($_SERVER["HTTP_CLIENT_IP"]))
            return $_SERVER["HTTP_CLIENT_IP"];

        return $_SERVER["REMOTE_ADDR"];
    }

    if (getenv('HTTP_X_FORWARDED_FOR'))
        return getenv('HTTP_X_FORWARDED_FOR');

    if (getenv('HTTP_CLIENT_IP'))
        return getenv('HTTP_CLIENT_IP');

    return getenv('REMOTE_ADDR');
}



$_SERVER['REMOTE_ADDR'];

Exemple:

if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}



Il devrait être contenu dans la $_SERVER['REMOTE_ADDR'] .




La réponse est d'utiliser la variable $_SERVER . Par exemple, $_SERVER["REMOTE_ADDR"] renvoie l'adresse IP du client.




Comme tous les autres l'ont déjà dit, vous pouvez utiliser $_SERVER['REMOTE_ADDR']; pour obtenir l'adresse IP du client.

En outre, si vous avez besoin de plus d'informations sur un utilisateur, vous pouvez utiliser ceci:

<?php
    $ip='0.0.0.0';
    $ip=$_SERVER['REMOTE_ADDR'];
    $clientDetails = json_decode(file_get_contents("http://ipinfo.io/$ip/json"));
    echo "You're logged in from: <b>" . $clientDetails->country . "</b>";
?>

Les informations plus spécifiques du client vont dans $ clientDetails.
Vous pouvez récupérer les éléments json stockés dans la variable $ clientDetails de cette façon: $ clientDetails-> PostalCode / hostname / region / loc ...

J'utilise ipinfo.io pour obtenir des informations supplémentaires.

J'espère que ça aide.




Comme je le sais La façon la plus simple d'obtenir l'adresse IP du visiteur / client est d'utiliser les variables $ _SERVER ['REMOTE_ADDR'] ou $ _SERVER ['REMOTE_HOST'] .

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

Les deux fonctions ci-dessous sont équivalentes avec la seule différence dans comment et depuis 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 les 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;
}