Ver Mensaje Individual
  #1 (permalink)  
Antiguo 03/10/2010, 08:12
Avatar de neodani
neodani
 
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Obtener la IP real del visitante, esta es la mejor forma?

Buenas,

Me gustaría saber vuestros comentarios sobre esta función para conocer la IP real del visitante.

Código PHP:
Ver original
  1. <?php
  2. function getRealIP()
  3. {
  4.    
  5.    if( $_SERVER['HTTP_X_FORWARDED_FOR'] != '' )
  6.    {
  7.       $client_ip =
  8.          ( !empty($_SERVER['REMOTE_ADDR']) ) ?
  9.             $_SERVER['REMOTE_ADDR']
  10.             :
  11.             ( ( !empty($_ENV['REMOTE_ADDR']) ) ?
  12.                $_ENV['REMOTE_ADDR']
  13.                :
  14.                "unknown" );
  15.    
  16.       // los proxys van añadiendo al final de esta cabecera
  17.       // las direcciones ip que van "ocultando". Para localizar la ip real
  18.       // del usuario se comienza a mirar por el principio hasta encontrar
  19.       // una dirección ip que no sea del rango privado. En caso de no
  20.       // encontrarse ninguna se toma como valor el REMOTE_ADDR
  21.    
  22.       $entries = split('[, ]', $_SERVER['HTTP_X_FORWARDED_FOR']);
  23.    
  24.       reset($entries);
  25.       while (list(, $entry) = each($entries))
  26.       {
  27.          $entry = trim($entry);
  28.          if ( preg_match("/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/", $entry, $ip_list) )
  29.          {
  30.             // http://www.faqs.org/rfcs/rfc1918.html
  31.             $private_ip = array(
  32.                   '/^0\./',
  33.                   '/^127\.0\.0\.1/',
  34.                   '/^192\.168\..*/',
  35.                   '/^172\.((1[6-9])|(2[0-9])|(3[0-1]))\..*/',
  36.                   '/^10\..*/');
  37.    
  38.             $found_ip = preg_replace($private_ip, $client_ip, $ip_list[1]);
  39.    
  40.             if ($client_ip != $found_ip)
  41.             {
  42.                $client_ip = $found_ip;
  43.                break;
  44.             }
  45.          }
  46.       }
  47.    }
  48.    else
  49.    {
  50.       $client_ip =
  51.          ( !empty($_SERVER['REMOTE_ADDR']) ) ?
  52.             $_SERVER['REMOTE_ADDR']
  53.             :
  54.             ( ( !empty($_ENV['REMOTE_ADDR']) ) ?
  55.                $_ENV['REMOTE_ADDR']
  56.                :
  57.                "unknown" );
  58.    }
  59.    
  60.    return $client_ip;
  61.    
  62. }
  63. ?>

¿Usáis otra función diferente, esta os parece bien? encontráis algún fallo?

Muchas gracias de antemano