2012-11-30 13 views
72

Sto usando questo codice PHP per ottenere l'indirizzo IP di un visitatore:Come ottenere l'IP reale dal visitatore?

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

Ma, non riesco a ottenere l'indirizzo IP reale da parte dei visitatori quando stanno usando un proxy. C'è un modo per ottenere l'indirizzo IP di un visitatore in questo caso?

+1

È possibile ottenere l'ip reale da un proxy solo se tale proxy non è completamente anonimo altrimenti si otterrà solo il proxy ip – Prix

+0

È possibile visualizzare questo collegamento http://allinonescript.blogspot.in/2016/09/how -to-get-real-ip-isp-country-city-and-etc-from-visitor-using-php.html –

risposta

127

Prova questo codice php.

<?PHP 

function getUserIP() 
{ 
    $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] 


?> 
+4

Dovresti anche gestire il caso in cui sono coinvolti più proxy, perché no? – Esailija

+17

Questo non è corretto poiché 'HTTP_CLIENT_IP' e' HTTP_X_FORWARDED_FOR' possono essere falsificati. Solo "REMOTE_ADDR" non può. –

+0

http://phpresult.com/source/share/GuAl1378725311 –

6

I proxy possono inviare un'intestazione HTTP_X_FORWARDED_FOR ma anche quella è facoltativa.

Inoltre, tenere presente che i visitatori possono condividere gli indirizzi IP; I network universitari, le grandi aziende e gli ISP del terzo mondo/a basso budget tendono a condividere gli IP su molti utenti.

+1

L'intestazione "specifica" può gestire più proxy, la catena di ips sarà separata dalla virgola nell'intestazione valore – Esailija

+0

Solo una nota. L'ISP del terzo mondo fa l'opposto. Crea un IP dinamico per ogni accesso. Quindi i suoi multipli IP per utente e non un ip per più utenti. – itachi

0

Sì, $_SERVER["HTTP_X_FORWARDED_FOR"] è come vedo il mio ip quando sotto un proxy sul mio server nginx.

Ma la soluzione migliore è eseguire phpinfo() su una pagina richiesta da un proxy in modo da poter esaminare tutte le variabili disponibili e vedere qual è quella che trasporta il tuo IP reale.

23

Questa è la tecnica più comune che ho visto:

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

Si noti che non garantisce che si otterrà sempre l'IP utente corretto, perché ci sono molti modi per nasconderlo.

17

Questo è il mio approccio:

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

Come si usa:

$ip = getRealUserIp(); 
+11

Questo è un uso molto strano e confuso di un'istruzione switch. http://www.codethinked.com/dont-be-clever –

+5

Cosa consideri confuso esattamente? Per me è abbastanza chiaro! –

+1

È confuso perché questo è esattamente ciò che è destinato a/elseif. – Andy

-1

Questo funziona per Windows e Linux! Non importa se si tratta di localhost o 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; 
} 
+0

Questo non funziona ogni volta perché ci sono più SO di Win e Linux. Chek questo: http://stackoverflow.com/a/738893/2127296 –

+0

Hai ragione, la soluzione funziona solo per Linux e vinci. :) – Valcone

+7

Restituisce l'indirizzo IP del server. Non del visitatore. La domanda ha richiesto l'indirizzo IP del visitatore. –

0
<?php 
function getrealip() 
{ 
if (isset($_SERVER)){ 
if(isset($_SERVER["HTTP_X_FORWARDED_FOR"])){ 
$ip = $_SERVER["HTTP_X_FORWARDED_FOR"]; 
if(strpos($ip,",")){ 
$exp_ip = explode(",",$ip); 
$ip = $exp_ip[0]; 
} 
}else if(isset($_SERVER["HTTP_CLIENT_IP"])){ 
$ip = $_SERVER["HTTP_CLIENT_IP"]; 
}else{ 
$ip = $_SERVER["REMOTE_ADDR"]; 
} 
}else{ 
if(getenv('HTTP_X_FORWARDED_FOR')){ 
$ip = getenv('HTTP_X_FORWARDED_FOR'); 
if(strpos($ip,",")){ 
$exp_ip=explode(",",$ip); 
$ip = $exp_ip[0]; 
} 
}else if(getenv('HTTP_CLIENT_IP')){ 
$ip = getenv('HTTP_CLIENT_IP'); 
}else { 
$ip = getenv('REMOTE_ADDR'); 
} 
} 
return $ip; 
} 


$MyipAddress = getrealip(); 
echo $MyipAddress; // IP: 58.97.178.57 
?> 

Questo è Output

4

diffusa questa codice per ottenere l'IP address:

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

// funzione per ottenere la indirizzo IP del cliente

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

See the detail Information

2

Questa è la mia funzione.

vantaggi:

  • lavoro se $ _SERVER non era disponibile.
  • Filtro IP privato e/o riservato;
  • processo tutti gli IP inoltrati in X_FORWARDED_FOR
  • compatibile con CloudFlare
  • possibile impostare un default se non ha trovato valida IP!
  • Breve & Semplice!

/** 
* 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; 
} 
0

Se il proxy è che ti fidi, si può provare: (Assumere la IP Proxy è 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; 

Ciò impedirà forgiato avanti colpo di testa di clienti diretti richiesti, e ottenere l'IP reale tramite proxy autorizzati.

Problemi correlati