Come ottenere l'indirizzo IP del client in PHP?


Answers

$_SERVER['REMOTE_ADDR'] potrebbe non contenere effettivamente gli indirizzi IP dei client reali, poiché fornirà un indirizzo proxy per i client connessi tramite un proxy, ad esempio. Potrebbe anche essere quello che vuoi veramente, a seconda di cosa stai facendo con gli IP. L'indirizzo RFC1918 privato di qualcuno potrebbe non essere utile se stai dicendo, cercando di vedere da dove proviene il tuo traffico, o ricordando a quale IP l'ultimo utente è connesso, dove l'IP pubblico del proxy o gateway NAT potrebbe essere più appropriato da conservare.

Esistono diverse intestazioni HTTP come X-Forwarded-For che possono o meno essere impostate da vari proxy. Il problema è che quelle sono semplicemente intestazioni HTTP che possono essere impostate da chiunque. Non c'è alcuna garanzia sul loro contenuto. $_SERVER['REMOTE_ADDR'] è l'effettivo indirizzo IP fisico dal quale il server web ha ricevuto la connessione e a cui verrà inviata la risposta. Tutto il resto è solo informazioni arbitrarie e volontarie. C'è solo uno scenario in cui puoi fidarti di queste informazioni: stai controllando il proxy che imposta questa intestazione. Significa solo se si conosce al 100% dove e come è stata impostata l'intestazione se doveste prestare attenzione a qualcosa di importante.

Detto questo, ecco alcuni esempi di codice:

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'];
}

Nota del redattore: l' uso del codice precedente ha implicazioni sulla sicurezza . Il client può impostare tutte le informazioni dell'intestazione HTTP (ad esempio $_SERVER['HTTP_... ) su qualsiasi valore arbitrario che desidera. Pertanto è molto più affidabile utilizzare $_SERVER['REMOTE_ADDR'] , in quanto non può essere impostato dall'utente.

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

Question

Come posso ottenere l'indirizzo IP del client usando PHP?

Voglio conservare la registrazione dell'utente che ha effettuato l'accesso al mio sito Web tramite il suo indirizzo IP.




Come so Il modo più semplice per ottenere l'indirizzo IP del visitatore / client è utilizzare le variabili $ _SERVER ['REMOTE_ADDR'] o $ _SERVER ['REMOTE_HOST'] .

Tuttavia, a volte questo non restituisce l'indirizzo IP corretto del visitatore, quindi possiamo usare alcune altre variabili del server per ottenere l'indirizzo IP.

Le due funzioni seguenti sono equivalenti con la differenza solo in come e da dove vengono recuperati i valori.

getenv() è usato per ottenere il valore di una variabile d'ambiente in 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 è un array che contiene variabili del server create dal server 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;
}



 $_SERVER['REMOTE_ADDR'];

prova questo




Come tutti gli altri hanno detto prima puoi usare $_SERVER['REMOTE_ADDR']; per ottenere l'indirizzo IP del client.

Inoltre, se hai bisogno di maggiori informazioni su un utente, puoi usare questo:

<?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>";
?>

Le informazioni più specifiche del cliente vanno in $ clientDetails.
È possibile recuperare gli elementi di JSON memorizzati nella variabile $ clientDetails in questo modo: $ clientDettagli-> Codice postale / nomehost / regione / loc ...

Sto usando ipinfo.io per ottenere informazioni extra.

Spero possa essere d'aiuto.




La risposta è usare la variabile $_SERVER . Ad esempio, $_SERVER["REMOTE_ADDR"] restituirà l'indirizzo IP del client.




Mi piace questo codenippet:

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');
}



La mia soluzione preferita è il modo in cui Zend Framework 2 utilizza. Considera anche le proprietà $_SERVER HTTP_X_FORWARDED_FOR , HTTP_CLIENT_IP , REMOTE_ADDR ma dichiara una classe per l'impostazione di alcuni proxy affidabili e restituisce un indirizzo IP non un array. Penso che questa sia la soluzione più vicina ad essa:

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;
    }

    // [...]
}

Vedere il codice completo qui: https://raw.githubusercontent.com/zendframework/zend-http/master/src/PhpEnvironment/RemoteAddress.php




Questa funzione è compatta e puoi usarla ovunque. Ma !

Non dimenticarlo! In questo tipo di funzioni o blocchi di codice non è garantito per registrare l'IP reale dell'utente perché alcuni utenti possono utilizzare proxy o altri gateway in modo sicuro per essere invisibili o non possono tracciare

Funzione 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;
}

Uso:

$IP = GetIP(); o direttamente GetIP();




Come quello????

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;
}

Tutte le intestazioni che iniziano con "HTTP_" o "X-" possono essere rispettivamente spoof definite dall'utente. Se si desidera tenere traccia dell'uso, usare i cooies ecc.




$_SERVER['REMOTE_ADDR'];

Esempio:

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'];
}



Dovrebbe essere contenuto nella variabile $_SERVER['REMOTE_ADDR'] .






Links