Contenido

Obtener la IP del usuario mediante PHP

23 abr

+ 7

Este código está por internet repetido una infinidad de veces, pero siempre que lo busco no lo encuentro. Así que me lo dejo aquí para futuros usos.

getIP()

Se trata de una función que obtiene la “IP real” ( o por lo menos la más acertada ) del usuario que te está visitando.

function getIP(){
    if( isset( $_SERVER['HTTP_X_FORWARDED_FOR'] )) $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    else if( isset( $_SERVER ['HTTP_VIA'] ))  $ip = $_SERVER['HTTP_VIA'];
    else if( isset( $_SERVER ['REMOTE_ADDR'] ))  $ip = $_SERVER['REMOTE_ADDR'];
    else $ip = null ;
    return $ip;
}

REMOTE_ADDR

Por defecto, el lugar en el que encontramos la IP del cliente. Aunque, no siempre es la más exacta…

HTTP_X_FORWARDED_FOR y HTTP_VIA

Ambas se encargan de recoger datos enviados por servidores proxy. En ellos encontraremos datos más exactos de la IP del usuario. En caso de que el visitante llegué atraves de un proxy estas variables nos devolverán la ruta de IP’s necesarias para llegar a la IP real.

Todo dependerá de la configuración del proxy ya que depende del tipo y de la configuración aplicada que nos lleguen una, dos o ninguna informadas.En 25fps48khz nos lo explican perfectamente.

  • Lo siento, sale mal, no caí en la revisión contra la inyección de código, y no salen las 2 primeras que son las interesantes, a ver si ahora:

    
    public static function getRealIP()
      {
        if( isset ($_SERVER['HTTP_X_FORWARDED_FOR']) and $_SERVER['HTTP_X_FORWARDED_FOR'] != '' )
        {
          $client_ip = (!empty($_SERVER['REMOTE_ADDR']) ) ? $_SERVER['REMOTE_ADDR'] :
          ( ( !empty($_ENV['REMOTE_ADDR']) )?$_ENV['REMOTE_ADDR']:false );
          $entries = split('[, ]', $_SERVER['HTTP_X_FORWARDED_FOR']);
          reset($entries);
          while (list(, $entry) = each($entries))
          {
            $entry = trim($entry);
            if ( preg_match("/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/", $entry, $ip_list) )
            {
              $private_ip = array(
              '/^0\./',
              '/^127\.0\.0\.1/',
              '/^192\.168\..*/',
              '/^172\.((1[6-9])|(2[0-9])|(3[0-1]))\..*/',
              '/^10\..*/');
              $found_ip = preg_replace($private_ip, $client_ip, $ip_list[1]);
              if ($client_ip != $found_ip)
              {
                $client_ip = $found_ip;
                break;
              }
            }
          }
        }
        else
        {
          $client_ip =( !empty($_SERVER['REMOTE_ADDR']))?$_SERVER['REMOTE_ADDR']:((!empty($_ENV['REMOTE_ADDR']))?
          $_ENV['REMOTE_ADDR']:false );
        }
        return $client_ip;
      }
    
      public static function getIp()
      {
        if ($_SERVER["HTTP_X_FORWARDED_FOR"] != "")
        {
          $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
          $ip_array = explode(",", $ip);
          $ip = $ip_array[0];
          $nums 	= sscanf($ip, "%d.%d.%d.%d");
          if ($nums[0] === null || $nums[1] === null || $nums[2] === null || $nums[3] === null || $nums[0] == 10   ||
          ($nums[0] == 172  && $nums[1] >= 16 && $nums[1] = 16 && $nums[1] <= 31) || ($nums[0] == 192  && $nums[1] == 168) ||
          $nums[0] == 239  || $nums[0] == 0 || $nums[0] == 127)
          $ip = $_SERVER["REMOTE_ADDR"];
        }
        else
        $ip = $_SERVER["REMOTE_ADDR"];
        return $ip;
      }
    

    La primera es muy fiable. Si aun asi no salen y si quieres puedes ponerte en contacto con migo y te paso la clase entera

  • Yo he utilizado estas variables del server y no he tenido buenos resultados.
    Las IP que devuelven casi siempre son privadas y no sirven de nada para la gestion de usuarios.
    Es preferible utilizar REMOTE_ADDR y luego trabajar con la session.
    saludos

  • ey no entiendoo nada de estoo como se hacee???

Comentar

#

Me reservo el derecho de eliminar y/o modificar los comentarios que contengan lenguaje inapropiado, spam u otras conductas no apropiadas en una comunidad civilizada. Si tu comentario no aparece, puede ser que akismet lo haya capturado, cada día lo reviso y lo coloco en su lugar. Siento las molestias.