2011-07-16 25 views
11

Duplicar posible:
What is the most accurate way to retrieve a user's correct IP address in PHP?función para obtener la dirección IP del usuario

¿Hay una mejor función en php para obtener la dirección IP del usuario? esto es lo que yo uso en el momento

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

"Mejor" en qué sentido? ¿De qué manera necesita el código que necesita mejorar? – Jon

+1

¿De dónde obtuviste esa función? por que lo usas? ¿Qué debería ser malo sobre eso? ¿Tuviste algún problema? – hakre

+0

@Jon - la sangría, para empezar. ;-) – Spudley

Respuesta

10

Bueno, su función debería comportarse como se esperaba, pero aquí hay algunas sugerencias:

// 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

no funciona correctamente – dino

+0

se olvidó de; después del retorno $ tmp – nikksan

32

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

cheques para direcciones IP (en orden) en:

  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

recordar que la única dirección IP de confianza es la que proviene de $_SERVER['REMOTE_ADDR'].

+4

¿Por qué marca 'REMOTE_ADDR' en ese momento? – Anther

+0

@Anther: para cuando el usuario no está detrás de un proxy. –

+0

¡increíble! funciona bien :) gracias – dino

Cuestiones relacionadas