2011-07-16 11 views
11

Powiel możliwe:
What is the most accurate way to retrieve a user's correct IP address in PHP?Function, aby uzyskać adres IP użytkownika

Czy istnieje lepszy funkcja w php, aby uzyskać adres IP użytkowników? to co używam w tej chwili

function GetIP() 
{ 
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) 
$ip = getenv("HTTP_CLIENT_IP"); 
else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) 
$ip = getenv("HTTP_X_FORWARDED_FOR"); 
else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) 
$ip = getenv("REMOTE_ADDR"); 
else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) 
$ip = $_SERVER['REMOTE_ADDR']; 
else 
$ip = "unknown"; 
return($ip); 
} 
+3

"Lepiej" w jakim sensie? W jaki sposób kod wymaga poprawy? – Jon

+1

Skąd masz tę funkcję? Dlaczego z niego korzystasz? Co powinno być w tym złego? Czy napotkasz jakieś problemy? – hakre

+0

@Jon - wcięcie, na początek. ;-) – Spudley

Odpowiedz

10

dobrze, funkcja powinna zachowywać się zgodnie z oczekiwaniami, ale oto kilka propozycji:

// lowercase first letter of functions. It is more standard for PHP 
function getIP() 
{ 
    // populate a local variable to avoid extra function calls. 
    // NOTE: use of getenv is not as common as use of $_SERVER. 
    //  because of this use of $_SERVER is recommended, but 
    //  for consistency, I'll use getenv below 
    $tmp = getenv("HTTP_CLIENT_IP"); 
    // you DON'T want the HTTP_CLIENT_ID to equal unknown. That said, I don't 
    // believe it ever will (same for all below) 
    if ($tmp && !strcasecmp($tmp, "unknown")) 
     return $tmp; 

    $tmp = getenv("HTTP_X_FORWARDED_FOR"); 
    if($tmp && !strcasecmp($tmp, "unknown")) 
     return $tmp 

    // no sense in testing SERVER after this. 
    // $_SERVER[ 'REMOTE_ADDR' ] == gentenv('REMOTE_ADDR'); 
    $tmp = getenv("REMOTE_ADDR"); 
    if($tmp && !strcasecmp($tmp, "unknown")) 
     return $tmp; 

    return("unknown"); 
} 
+0

nie działa prawidłowo – dino

+0

zapomniałem; po powrocie $ tmp – nikksan

32

zaadaptowany z this answer:

function GetIP() 
{ 
    foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key) 
    { 
     if (array_key_exists($key, $_SERVER) === true) 
     { 
      foreach (array_map('trim', explode(',', $_SERVER[$key])) as $ip) 
      { 
       if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false) 
       { 
        return $ip; 
       } 
      } 
     } 
    } 
} 

czeków dla adresów IP (w kolejności) w:

  1. HTTP_CLIENT_IP
  2. HTTP_X_FORWARDED_FOR
  3. HTTP_X_FORWARDED
  4. HTTP_X_CLUSTER_CLIENT_IP
  5. HTTP_FORWARDED_FOR
  6. HTTP_FORWARDED
  7. REMOTE_ADDR

Pamiętaj, że adres IP tylko można zaufać jest jeden pochodzący z $_SERVER['REMOTE_ADDR'].

+4

Dlaczego więc sprawdza się 'REMOTE_ADDR'? – Anther

+0

@Anther: Gdy użytkownik nie jest za serwerem proxy. –

+0

niesamowite! działa dobrze :) dzięki – dino