Obtención de la IP real de una visita web en PHP

Patxi Echarte, April 26th, 2005

La forma más sencilla de obtener la dirección IP de un usuario en PHP es mediante la utilización de $_SERVER['REMOTE_ADDR'], sin embargo este valor no siempre es el que estamos buscando, hay veces en que las visitas llegan a nuestro web a través de proxys de que ocultan su dirección IP.

En la mayoría de los casos es aún posible obtener la dirección IP del usuario en estas situaciones, utilizando determinadas cabeceras. Pero antes conviene tener en cuenta las cabeceras que llegan al servidor web y los diferentes tipos de proxy que existen, para saber cómo funcionan y cómo obtener la dirección IP.

Cuando pedimos una página web el navegador se encarga de realizar la petición enviando una serie de cabeceras HTTP al servidor web. Estas cabeceras se hacen disponibles en el servidor web mediante variables de entorno que se añaden a las propias del servidor web, haciendo que tengamos disponibles variables como DOCUMENT_ROOT, HTTP_USER_AGENT, HTTP_ACCEPT_ENCODING, SERVER_ADDR, SERVER_PROTOCOL, HTTP_HOST… entre otras.

Aparte de estas variables de entorno provenientes tanto del cliente como del servidor, puede haber otras variables generadas a partir de cabeceras cuyo origen no es el cliente, si no algún sistema intermedio como proxys. En estos casos, cuando la petición web de un usuarios pasa a través de un proxy o anonimizador, estos pueden modificar las cabeceras del cliente o añadir nuevas, dependiendo del tipo de sistema que sea como veremos más adelante.

Para lo que nosotros necesitamos las siguientes son las variables de entorno más importantes:

  • REMOTE_ADDR: dirección ip del cliente
  • HTTP_X_FORWARDED_FOR: si no está vacío indica que se ha utilizado un proxy. Al pasar por el proxy lo que hace éste es poner su dirección IP como REMOTE_ADDR y añadir la que estaba como REMOTE_ADDR al final de esta cabecera. En el caso de que la petición pase por varios proxys cada uno repite la operación, por lo que tendremos una lista de direcciones IP que partiendo del REMOTE_ADDR original irá indicando los proxys por los que ha pasado.

Respecto al funcionamiento de los proxys y su interacción con la cabecera que genera la variable HTTP_X_FORWARDED_FOR, hay que tener en cuenta un par de cosas más. Por un lado la forma en la que los proxys concatenan la dirección del REMOTE_ADDR anterior al final de la cabecera no es siempre igual ya que en algunos casos se utiliza una coma y en otros un espacio. Por otro lado hay que tener en cuenta también que la primera dirección IP que viene en la variable HTTP_X_FORWARDED_FOR en algunas ocasiones es una dirección IP de las pertenecientes a los rangos de utilización privada. En estos casos partiendo de estas direcciones hay que continuar mirando el resto de direcciones disponibles hasta encontrar una del rango público.

Una vez vistas estas dos variables de entorno, conviene entender también, al menos de manera resumida, los diferentes tipos de proxy que existen.

Proxies transparentes

No ocultan la información IP de los clientes, únicamente la añaden a HTTP_X_FORWARDED_FOR dejando la suya en REMOTE_ADDR. El objetivo de estos proxys no es el de proporcionar anonimicidad en la red, sino la de cachear información o servir de punto de acceso común a Internet para varios equipos.

REMOTE_ADDR = IP-proxy
HTTP_X_FORWARDED_FOR = IP-cliente

Proxies anónimos

Estos proxies ocultan la dirección ip del cliente proporcionando una forma de navegar anónima. La forma en que ocultan la dirección ip del cliente hace que un proxy se clasifique en una de las siguientes categorías:

Simples

No se oculta el hecho de que se está utilizando un proxy, únicamente se guarda la dirección ip del proxy en ambos cabeceras, sin que aparezca por ningún sitio la del cliente.

REMOTE_ADDR = IP-proxy
HTTP_X_FORWARDED_FOR = IP-proxy

Proxys ruidosos

Son similares al anterior caso con la salvedad de que en vez de guardar su dirección ip HTTP_X_FORWARDED_FOR, guardan una generada aleatoriamente.

REMOTE_ADDR = IP-proxy
HTTP_X_FORWARDED_FOR = IP-aleatoria

Proxys de alta anonimicidad

Este tipo de proxys oculta el hecho de que se esté utilizando un proxy para realizar la petición. Para ello sustituyen la dirección IP existente en REMOTE_ADDR por la suya y no lo indican mediante ninguna otra cabecera, por lo que no es posible saber que se está utilizando un proxy.

REMOTE_ADDR = IP-proxy
HTTP_X_FORWARDED_FOR = sin-determinar

Código PHP

Una vez explicados esta serie de conceptos ya estamos en disposición de poder entender el siguiente código, cuyo objetivo es el de obtener la dirección IP real del usuario.

function getRealIP()
{
   
   if( $_SERVER['HTTP_X_FORWARDED_FOR'] != '' )
   {
      $client_ip =
         ( !empty($_SERVER['REMOTE_ADDR']) ) ?
            $_SERVER['REMOTE_ADDR']
            :
            ( ( !empty($_ENV['REMOTE_ADDR']) ) ?
               $_ENV['REMOTE_ADDR']
               :
               "unknown" );
   
      // los proxys van añadiendo al final de esta cabecera
      // las direcciones ip que van "ocultando". Para localizar la ip real
      // del usuario se comienza a mirar por el principio hasta encontrar
      // una dirección ip que no sea del rango privado. En caso de no
      // encontrarse ninguna se toma como valor el REMOTE_ADDR
   
      $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) )
         {
            // http://www.faqs.org/rfcs/rfc1918.html
            $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']
               :
               "unknown" );
   }
   
   return $client_ip;
   
}

Básicamente lo que hace la función es partiendo de la dirección indicada en REMOTE_ADDR obtener la dirección IP real. Si HTTP_X_FORWARDED_FOR es vacío la dirección que hemos obtenido previamente es la real (a no ser que se esté utilizando un proxy de alta anonimicidad). En caso contrario lo que se hace es obtener la lista de direcciones IP almacenada en HTTP_X_FORWARDED_FOR y buscar la primera que sea del rango público.

Más información

Comparte esta información

105 Comentarios para “Obtención de la IP real de una visita web en PHP”

  1. EsLoMas.com » Información sobre la petición web en PHP con HttpRequest dice:

    […] a través de algún proxye. La función que se utiliza para ello es la comentada en el post obtención de la ip real de una visita web. Información GET, POST y […]

  2. julio dice:

    hmmm nose por uqe no corre ese codigo en mi pagina, estare haciend algo mal? lo puse en php pero nada no pas anad asolo me sale

    Warning: Unexpected character in input: ‘\’ (ASCII=92) state=1 in E:\Server\index.php on line 14

    Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in E:\Server\index.php on line 22

  3. Patxi dice:

    Si puedes prueba de nuevo a copiar el código, el problema se debía a una molesta característica de wordpress que hace que se escapen las comillas dentro de los campos pre.

    Lo he modificado, por lo que el código ya debería aparecer en la página tal como está escrito en realidad y 100% funcional ;)

  4. Edgardo dice:

    Muy Bueno, me funciona bien.
    Gracias.

  5. Fabiosan dice:

    Que podría hacer para obtener la IP del cliente en un proxy de alta anonimicidad ?

  6. Patxi dice:

    Los proxys de alta anonimicidad no envían información en la cabecera HTTP_X_FORWARDED_FOR, por lo que en este caso no podríamos saber que está siendo utilizado, al menos no basándonos únicamente en las cabeceras HTTP.

    Quizás se podría hacer algo utilizando JavaScript, pero realizando una pequeña busqueda en Google no he encontrado ningún mecanismo que funcione con carácter general.

  7. José Luis dice:

    Tengo instalado Apache2 + php5. Me dá el sigueinte error:
    Parse error: syntax error, unexpected T_IF, expecting … line 3

    Agradecería que me ayudarán a encontrar el problema.

  8. encripted dice:

    …hay maneras que aunque utilices javascript , java , activeX etc es imposible descubrir la IP real sino te saltaría la ip local.

    Ademas seria una gilipollez descubrir la ip real , entonces para que coño servirian los proxies?

    ademas tambien puedes juankear algun escritorio remoto y desde allí hacerlo todo , no hace falta ser hacker , juaker o juanker

  9. Patxi dice:

    me da la impresión de que no has leido en absoluto el artículo… en él se dice que hay situaciones en las que no es posible obtener la dirección ip de la visita, pero hay situaciones en las que sí, según el tipo de proxy que se utilice, porque como estoy seguro que sabrás, hay varios tipos de proxy ;)

  10. Israel dice:

    La verdad no entendi nada
    digan de una manera clara como obtengo un ip real de una computadora
    paso a paso

  11. Patxi dice:

    A ver Israel, la función de PHP getRealIP te permite obtener a partir de las cabeceras enviadas por el navegador del usuario la dirección “ip pública” del equipo de cliente.

    La primera parte del artículo viene a explicar el mecanismo en el que se basa el código PHP para obtener la IP, y explica los posibles problemas qué puede haber, como situaciones en las que no sea posible obtener la IP.

    Por supuesto, todo esto teniendo en cuenta que lo que quieras es obtener la ip de un usuario que acceda a una web, si lo que quieres es obtener la ip de un ordenador desde el mismo equipo u otras cosas por el estilo, eso no tiene nada que ver con esto

  12. Kike Cerati dice:

    Pero, pero, pero…

    Yo necesito saber la IP de equipos que están detrás de un proxy de alta anonimicidad (vaya palabra!), lo he intentado buscar en javascript y no encuentro na’a, sería posbile (y perdón por la pregunta) bajar ese nivel de anonimicidad (de nuevo esa palabra!)????

    El proxy es una web Marshal

  13. Patxi dice:

    NO es posible obtener la dirección IP de un equipo que está tras un proxy de alta anonimicidad. Si tienes acceso al proxy podrías configurarlo como proxy transparente, que es la única forma en la que te llegará información sobre la IP real.

  14. lisa dice:

    como puedo hacer para ver mi ip y esconderlo?de todos.

  15. marcelo dice:

    Hola, he copiado la funcion y no me ha detectado la ipreal de las estaciones clientes. Tengo apache2 + php5 + mysql en el servidor web.
    Este esta montado a su vez en un proxy Ipcop.
    Queria saber porque me detecta las ip siempre con la ip del proxy (192.168.1.10).
    Gracias. Un abrazo.

  16. Patxi dice:

    Prueba a crear una página que únicamente haga un phpinfo() y luego accede a ella. Para que esta función funcione en algún lugar debería aparecer tu IP, seguramente como parte de HTTP_X_FORWARDED_FOR, si no es así, se deberá seguramente a que el proxy no está pasando la ip del usuario al servidor.

    Otra posibilidad puede ser que sí que le llegue la dirección pero estés probando todo en una red privada. La función esta pensada para obtener la dirección IP pública de un usuario, por lo que si la utilizas en una red interna con direcciones IP de los rangos privados puede que tengas que retocarla.

  17. marcelo dice:

    Si tenes razón, mis pruebas son todas en una Red Privada. (en una intranet en una oficina publica).
    1) Te pregunto, como tendria que tocar la funcion para que me de las verdaderas ip de las estaciones clientes.
    2) Que tendría que tocar en el proxy o en el Servidor Web (Intranet) para evitar esto.
    Muchas gracias por tu respuestas.
    un abrazo, marcelo.

  18. Patxi dice:

    Lo mejor es que mires el contenido exacto de HTTP_X_FORWARDED_FOR cuando una petición llega al servidor pasando por el proxy (usa phpinfo). Cuando la veas, seguramente contendrá la dirección IP original del cliente, modifica o crea una función específica para tratar tu caso, quizás te valga con un simple split o incluso con coger directamente el valor de la variable. La función publicada es para casos de redes públicas que por su naturaleza ha de ser bastante mas flexible.

    Respecto a la segunda pregunta no puedo ayudarte, tendrás que mirar la documentación del proxy en cuestión

    un saludo

  19. Cesar dice:

    No solo que el codigo funciona al 100%, sino que la explicacion previa es brillantemente simple. Desde aqui te agradezco la informacion expuesta.

  20. alain dice:

    como hago funcionar este scrip en un servidor windows con IIS y php 5 y mysql 5

  21. Jose Sevilla dice:

    El código está genial, precisamente buscaba algo que ampliara una de las rutinas del programa (PHP) Teardropscounter, un buen código para detectar si una web tiene visitas “frikis” (FBI, CIA, SGAE, etc).

  22. Pablo Marti dice:

    ¡Exelente!

    Yo mismo lo subí a mi web y lo prové con mi proxy, y es realmente asombroso.

    Muy bien. felicitaciones.

  23. puede conocerse la ip de un website?? dice:

    me gustaria saber si podeis encontrar la ip de mi Website y si encontrais algunas fallas en mi sistema de seguridad, podeis hacermelas llegar al correo del site o al que les he dejao aki. angel_villasmil@cantv.net

  24. Christian dice:

    Disculpa la ignorancia, pero como llamo a la funcion para ver el ip ??

  25. Mike dice:

    hola que tal este espacio esta muy bueno pero no soy tan bueno el la computadora y no me quedo muy claro les cuento quiero obtener la IP de una pagina web tengo que tener algun programa y introducir en el lo que dice aqui o lo hago por medio de D.O.S. Alquien que me pueda orientar porfavor no se como hacerle y si nesesito la IP mkb740@hotmail.com

  26. amanda dice:

    quisiera saber la direccion ip de la pagina de hotmail, es para una tarea y de verdad la necesito esperando y me contesten gracias…

  27. ikkix dice:

    Hotmail: IP: 208.172.13.254

    Check Utility IP:
    http://www.geobytes.com/IpLocator.htm?GetLocation

    salu2

  28. nomed dice:

    buenas, encuentro muy interesante lo comentado aqui, y entiendo el significado del proxy de alta anomicidad, encuentro claro tb que no se podriamos conocer la ip real, y por mi parte en un sitio web me conformaria con saber que viene de un proxy y echarlo a la mierda, si no quiere que yo sepa su ip NO QUIERO QUE ENTRE EN MI WEB, es logico no?????????? como sabria yo que procede entonces de un proxy, siendo el proxy de alta anomicidad el ultimo y sabiendo que no me dara el HTTP_X_FORWARDED_FOR correcto para detectar si es o no un proxy??????????????????

  29. Patxi dice:

    pues la respuesta es sencilla y corta, sencillamente no puedes ;)

  30. moni dice:

    pregunto lo mismo q Christian
    soy nueva usan el php , si yo tengo una web y quiero saber la ip de los usuarios q entran a mi web, con esta funcion
    como le hago ??? pego el codigo en una pagina nueva o en el index, y despues donde veo las ips?
    disculpen la ignorancia pero necesito su ayuda gracias

  31. Patxi dice:

    Tienes que utilizar esta función como utilizarías cualquier otra desarrollada por ti. Si solo te hace falta en una página podrías pegarla dentro de ella, pero lo más recomendable es que la pongas en un archivo separado y lo incluyas con “include”. Para obtener la ip del usuario podrías simplemente hacer $ip = getRealIp(), y una vez hecho eso, pues depende de lo que quieras. Si quieres enseñársela al usuario puedes hacer “echo $ip”, o puedes guardarla en bbdd, o en un log,… eso ya depende de tus necesidades concretas.

  32. dieguito dice:

    hola porfavor quiero y necesito la ip REAL de lp agina www.meebo.com porfavor!!!!

    si me la pudiesen dar muchas gracias… la pagina le pongo un 10!!!!

    saludos

  33. Fabian dice:

    Interesante articulo, tambien hay que aclarar que si el cliente tiene una aplicacion escrita en vb o algo que pueda manejar las cabeceras se hace dificl obtener la ip real.
    Saludos

  34. Patxi dice:

    dieguito, este artículo tiene bastante poco que ver con lo que preguntas, de hecho es todo lo contrario. Para lo que quieres te sería suficiente con hacer un ping al nombre del dominio, o utilizar un comando como nslookup, encontrarás abundante información sobre ellos en google.

  35. Patxi dice:

    Hasta cierto punto fabian, ten en cuenta que hay información que no va en cabeceras generadas en el cliente. Por ejemplo el REMOTE_ADDR lo obtiene el servidor web a partir de la dirección ip solicitante, y la cabecera HTTP_X_FORWARDED_FOR la incluyen los proxys al pasar por ellos.

  36. Jose dice:

    Muy muy buena función aunque te recomiendo que utilices los puntos escapados en las expresiones regulares compatibles con perl.

    Algun proxy puede darte la ip del usuario rellena de 0’s (por ejemplo: 088.003.213.025) y la función falla porque la primera expresion de $private_ip se cumple.

    En resumen:

    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\..*/’);

    o incluso (aunque parezca muy raro):
    $private_ip = array(
    ‘/^(00)?0\./’,
    ‘/^127\.(00)?0\.(00)?0\.(00)?1/’,
    ‘/^192\.168\..*/’,
    ‘/^172\.0?((1[6-9])|(2[0-9])|(3[0-1]))\..*/’,
    ‘/^0?10\..*/’);

    Un saludo y gracias por compartir la función.

  37. Patxi dice:

    Hola Jose, muy buena apreciación. En efecto es conveniente SIEMPRE escapar los puntos en las expresiones regulares para distinguirlos del caracter especial, de hecho suele ser algo que no se hace en muchas ocasiones y que puede provocar no solo fallos, sino también agujeros de seguridad.

    De todas formas tengo que decir que los puntos sí que estaban escapados en el código original, sin embargo Wordpress al mostrar el código los ha eliminado, con lo que he tenido que escaparlos dos veces para que se mostrasen.

  38. Enrique dice:

    Alguien podria decirme como queda la pagina final php para poder ver si me corre. Perdonen es que estoy unpoco frito en estas cosas y deseo crear una pagina que redireccione el cliente en dependencia de su ip.
    Les agradesco de ante.

  39. edison ayala dice:

    Desearia que me indiquen como hago correr la aplicacion en la que me dan el codigo como la guardo no conopzco mucho php que extension de archivo etc gracias

  40. Patxi dice:

    bueno, sin que sirva de precedente, voy a explicar algo que no está relacionado con el artículo sino con PHP básico. La forma más sencilla de utilizar el código de esta función sería por ejemplo guardar lo siguiente como un archivo ip.php:

    <?php

    function getRealIP(){
    ………código completo de la función…….
    }

    // llamamos a la función para obtener la ip del usuarios
    $ip = getRealIP();

    // ahora ya podemos trabajar con la variable $ip
    // que contendría la ip del usuario

    // Según lo que pretendamos hacer podríamos llamar directamente a este archivo
    // con el navegador, o hacer un include de él desde otro programa…

    ?>

  41. Enrique dice:

    Gracias Patxi ya logre correr la pagina. Pero ahora tengo un problema.
    Yo quiereo que dada la ip que me detecta este script redireccionar al cliente a una pagina o sitio web distinto pero no lo logro.

    Ya trate con header ( location: …. y nada. Es que tengo que poner este codogo en la cabecera o que.
    Inserte luego de este script un if ($ip == 127.0.0.1) { header( “location: http://www.yahoo.com” ) } a modo de prueba y me detecta la ip pasa por el if pero no me redirecciona. Que puedo Hacer ?/???????
    Ayudenme es que quiero direccionar a las ip a sus respectivos servidores de correo WEB.

  42. Patxi dice:

    lo primero comprueba que efectivamente entre en el if, no sé si se te han olvidado las comillas o ha sido el editor al guardar tu comentario, pero mete la dirección ip de la comparación entre comillas. Para comprobar si entra en el if prueba a poner dentro un echo(”ha entrado en el if”);, a ver si te sale el mensaje en el navegador. Si te sale, debería rederigirte. Lo único que tienes que tener en cuenta es que antes del header no deberías haber enviado ningún carácter de vuelta hacia el navegador, ni con echo ni html fuera de etiquetas de php. Como último recurso te quedaría utilizar JavaScript haciendo un echo de un <script> que contuviera la redirección con location.href.

  43. Enrique dice:

    Ok no las comillas la tenia puesta. Gracias ya lo resolvi. Simple puse el codigo en la pagina antes de declarar los tags html y los meta y head y todo. Osea puese una pagina que solo tiene el cogido php y con esto y un switch logre mandar a cada cual para su servidor de correo.

  44. Rodnie dice:

    Hola … implemente la funcion getIpReal()… pero me aparece el siguiente error:

    Notice: Undefined index: HTTP_X_FORWARDED_FOR in D:\www\smc\Php\getIpReal.php on line 5

    Recien me estoy iniciando en el mundo PHP… se que me falta inicializar esta variable…
    Agradezco de antemano tu ayuda….

    Saludos,,,,

  45. Patxi dice:

    Rodnie, en realidad lo que te da no es un error sino un “notice” debido a que se está accediendo a una posición de matriz que no existe. Para evitar que te salgan los notice puedes usar la función de php error_reporting, o cambiar el primer if de la función.

  46. Rodnie dice:

    Patxi, algo parecido hice… agregue un if con la funcion
    if (!isset($_SERVER[’HTTP_X_FORWARDED_FOR’])), gracias por la ayuda…

    Saludos …..

  47. Americo dice:

    Hola a todos, me funciona perfectamente el script, felicitaciones a Patxi por ser desprendida con el conocimiento, sin embargo hay un dato que aun necesito, si bien el script devuelve el IP publico asociada a una maquina cliente, necesito saber ademas el IP privado que tiene, algo asi como aparece en esta pagina: http://www.deltron.com.pe/

    Seria bueno que la funcion devuelva un arreglo donde el indice 0 tenga el IP Publico y el indice 1 el Privado.

    Podrian ayudarme por favor?
    Muchas Gracias

  48. Patxi dice:

    Hola Americo, en principio la mayoría de las veces no es posible obtener la dirección ip privada del usuarios. Ten en cuenta que la mayoría de las conexiones se realizan a través de routers que hacen NAT ocultando los direccionamientos de red internos.

    La única situación en la que podría llegar al servidor tu dirección IP privada es si al pasar por un proxy ésta se añade a la cabecera HTTP_X_FORWARDED_FOR. En esta cabecera se van añadiendo al final las direcciones que van “ocultando” los proxys, por lo que en principio la primera “podría” ser tu dirección privada, pero ten en cuenta que depende de que el usuarios salga por un proxy y esté configurado para indicar la dirección ip privada de la conexión, algo no muy normal.

    Si en la página que indicas te da tu dirección ip privada será porque sales por un proxy de este tipo, aunque seguramente también se deba a que la página esté utilizando una función de detección de IP incorrecta y no procese bien la cabecera que te indico, porque de hecho, tu dirección ip en internet no es tu dirección privada sino tu dirección pública.

  49. Americo dice:

    Hola Francisco, bueno Patxi ;) , no se si este post va con la tematica de este hilo, pero necesito ayuda con SSL con Apache2 y PHP 5, realmente estoy empeñado en ver como funciona esta tecnologia y no encuentro en ningun lado un ejemplo completo que me permita tener una idea clara de como funcionan las cosas, realmente necesito ayuda, agradeceria mucho su ayuda

    Muchas Gracias
    Un Abrazo
    Americo Torres

  50. Americo dice:

    Bueno explico mejor la situacion en la que me encuentro: Estoy realizando una intranet en la cual existen dos partes bien diferenciadas:
    - La primera es la parte operativa donde los cajeros haran operaciones de depositos y retiros.
    - La segunda que es la parte de supervision, es donde el Jefe de Operaciones abre el sistema para que los cajeros puedan logearse.

    Es esta segunda parte la de mayor cuidado, pues los cajeros ingresan al sistema con un formulario tipico de login (usuario + clave + nivel de acceso), pero en el modulo de supervision deseo agregar la posibilidad de que el supervisor aparte de poner su usuario y clave pegue su llave publica en un textarea y poder validar esto tambien, es una intranet muy sensitiva porke se maneja dinero, de ahi mi extremo cuidado en el diseño de accesos.

    Puede alguien mostrarme un codigo que realice esto de la generacion y validacion de llaves, yo he bajado el OpenSSL.

    Gracias

  51. Patxi dice:

    Pues poco te puedo ayudar con esto… creo que OpenSSL te servirá para generar y validar las claves, y lo único que se me ocurre que te pueda aportar, es que quizás no necesites el textarea para la llave pública, quizás te valga con generar un certificado, instalarlo en el navegador y configurar el servidor de forma acorde, aunque como te digo, poco más te puedo decir, no me ha tocado nunca hacer nada de esto, así que te hablo sólo de lejos.

  52. Jose dice:

    Hola Patxi.

    Mi nombre es Jose y te felicito por la web.
    Tengo dudas con respecto el código web para poder saber las ip de los visitantes.
    Aquí tienes el código que le he puesto a mi web:

    $ip = getRealIp(log.txt)

    El caso es que quiero ver las IP de los visitantes a través de un archivo
    (log.txt). Me lo descargo del servidor y está totalmente en blanco.

    ¿Qué está mal en el código?

  53. Patxi dice:

    Hola Jose, estás pasando log.txt a la función pero ésta no acepta ningún parámetro. Si lo que quieres es escribir la ip que te devuelve getRealIp en el archivo log.txt lo que tendrías que hacer es ejecutar $ip = getRealIp(); y luego abrir el archivo log.txt en modo escritura (append) y escribir una línea con el valor de la variable $ip. Para ello mira en php.net/fwrite y php.net/fopen.

  54. Andrea dice:

    ¿ Como puedo saber la direccion IP de un cliente ?

    Les agradeceria mucho si me ayudaran es de suma urgencia ..

    ahaha y muy buena esta pagina ..

    Felicitaciones..

  55. ale dice:

    como puedo saber la direccion ip de un cliente? y con eso sabre mas informacion del cliente y de su equipo?

  56. Patxi dice:

    la dirección ip del cliente la puedes obtener (en algunos casos) con el código que se indica arriba. Con eso sabrás la dirección ip, otra cosa es lo que hagas con ella, por supuesto hay cosas que se pueden obtener a partir de ella, pero eso queda fuera de este post ;)

  57. Adrian dice:

    Saludos, disculpa, estoy empezando con esto de php y tengo instalado el easyphp en ambiente windows xp, bueno el chiste es que copie el script del post para probralo, pero resulta que no me aparece nada al momento de ejecutarlo, me podrias decir por favor como hago para que me aparezca en pantalla la ip o lo k tenga k aparecerme, de antemano te agradezco, gracias, nos vemos.

  58. Patxi dice:

    Adrian, lee los comentarios anteriores, está explicado en uno de ellos.

  59. osniel dice:

    Hola, estoy comenzando en php, esto de como guardar las ip pues no lo entiendo muy bien, ?si alguien pudiera explicarme brevemente esto se lo agradeseria.

  60. Ana dice:

    La dirección IP de la pagina Hotmail es 216.74.180.189

  61. Ana dice:

    La dirección IP de la página www.meebo.com es 65.19.140.246

  62. danielf dice:

    buena la intencion.. pero he probado la funcion en una pagina de prueba para ver si funciona correctamente..

    Separando el tama de proxys, he tratado de ponerla a prueba en uso comun, nmandando el enlace a mi pagina por MSNMessenger y no captura la IP real, sino la IP del mismo MSN.. al igual, con tan solo enviar el enlace por email, con captura el Ip del router del cliente. incluso lo he probado conmigomismo, y solo funciona si se accede directamente a la web.

  63. Alisha dice:

    Hola, soy nueva programando y necesito que me ayuden en el tema de incluir este código a la página. Yo he hecho lo siguiente

    y me sale error. Bueno, en realidad me gustaria guardarlo en un txt, pero no se como hacer esto…podrías ayudarme :S

  64. Alisha dice:

    Lo que hice fue incluir hacer include(’ip.php’); y luego a una valiable $ip le asigne el valor getIPReal(); por ultimo echo “Su ip es $ip”;

  65. Patxi dice:

    Alisha, la función se llama getRealIP, no getIPReal, quizás sea eso.

  66. Alisha dice:

    no, me equivoque al escribir aquí, porque no me funciona con copy/paste :O, pero quisiera que me digas como podría hacer para guardar ese dato en un txt, donde crearlo, etc. Gracias !!
    Saludos

  67. Patxi dice:

    En un comentario de más arriba explico en unas pocas líneas qué es lo que habría que hacer. Básicamente es abrir un fichero en modo append y luego escribir en él con fwrite. Mira el comentario y la documentación de php sobre fwrite en http://www.php.net/fwrite

    Espero que te sirva, un saludo

  68. manuel lopez dice:

    saludos,
    les comento mi situacion, tengo un formulario simple para capturar datos de contacto con HTML hecho en frontpage, para capturar los datos del formulario y enviarlos a un correo utilizo PHP, como puedo hacer para que ademas de los datos que las persona digitan, automaticamente el formulario me envie la IP publica de donde se genero el envio, GRACIAS

  69. Patxi dice:

    Manuel, si lees el artículo y los comentarios obtendrás la respuesta a la duda que planteas.

  70. giev dice:

    El script es excelente. Pero no logro solucionar el problema. En una base de datos Mysql guardo la ip de los que votan en mi encuesta, pero el registro que guarda es la ip de conexión y me pierdo de muchos votos. Existe alguna forma de detectar ip del cliente y no solo de conexión?.
    Gracias!

  71. Patxi dice:

    si te refieres a que puede haber varios usuarios accediendo a tu web con la misma ip pública, y que por lo tanto todos parecen un único usuario, puedes probar varias cosas. Lo más sencillo por ejemplo sería añadir un tiempo de prohibición de repetición de voto más corto, pero podrías utilizar también un identificador de sesión o una cookie generada aleatoriamente, bien por tí manualmente o por algún modulo de apache

  72. Yez dice:

    Disculpen que mi pregunta no sea de este tema específicamente, pero estoy tratando de hacer una Intranet donde necesito el uso de sesiones de usuarios. Una forma podría ser evaluando el “usuario”, “contraseña” y “IPdelcliente” (ESTE ARTICULO) como número de sesión, pero con los problemas que se pueden presentar con los Proxys y un futuro acceso por VPN no lo veo conveniente. He escuchado que también se puede por cookies o asignándole un número de sesión a un usuario una vez que se leguee, pero hasta el momento no he encontrado ayuda de estas 2 opciones adicionales para enviar a todas las páginas un usuario resgistrado (logueado). Les agradezco cualquier ayuda.

  73. Yez dice:

    Aclaro que los parámetros de “usuario”, “contraseña” y “sesión” deben ser ocultos para evitar que personal cualquiera entre cambiando datos en la ruta ó URL. Gracias

  74. Patxi dice:

    Tienes información de cómo funcionan las sesiones en php en http://es2.php.net/manual/es/ref.session.php

  75. luci dice:

    ¿como puedo saber las personas q visitan mi fotolog??, me dijeron q es mediante le ip, pero no tengo ni idea. gracias

  76. Yez dice:

    Muchas gracias Patxi, me fue de mucha ayuda tu link sobre sesiones.

  77. CMS dice:

    Muy interesante, si bien, he leído por otros sitios, que utilizar HTTP_X_FORWARDED_FOR no es seguro, porque es una variable que puede ser modificada por el usuario. También creo haber leído que el phpbb la utilizaba y tuvo que cambiar de método porque era inseguro. ¿Alguna información al respecto?

    Por otro lado, si alguien es tan amable, me gustaría saber algún ejemplo de proxy anónimo. No entiendo muy bien el concepto, ya que aunque un proxy pudiera cambiar la ip aleatoriamente, el propio proxy no tendría una ip?? Si tuviéramos problemas con un usuario conectándose a través de un proxy. ¿no habría forma de bloquear todo ese proxy?

  78. diana maria dice:

    me parece interesante el tema…gracias yo estudio servidores.y diseño de paginas web no tenia mucha idea como funcionaban los proxys..solo se qeu ocultaban el IP.

  79. Edison dice:

    Hola, he usado a perfección tu código… muchas gracias por la ayuda

  80. El cajón desastre » Blog Archive » PHP : Identificar la IP Real del Usuario dice:

    […] Buscando información acerca de obtener la IP real (en los casos en los que fuera posible) me tropecé con un artículo interesante sobre como los distintos proxies alteran los datos del navegador para enmascarar su propia IP. […]

  81. Winnie dice:

    Hola, a todos espero alguien pueda ayudarme, mi problema esta relacionado con las IP de los equipos que entran en un site para votar en una encuesta, tengo que lograr que solo puedan votar una vez en cada encuesta, soy nueva en estos menesteres asi es que ojalá la explicación sea sencilla.

    Saludos y espero su ayuda.

  82. Jose Luis dice:

    Estoy usando la funcion getRealIp , bajo la intranet haciendo pruebas y solo me da la ip local en unos casos y en otros(desde linux) solo me da 127.0.0.1, he probado otras paginas y haciertan on mis 2 direcciones la publica y la privada, lo que asumo que mi proxy esta dejandole obtener esas cabeceras… En resumen la funcion no me funciona bajo mi intranet!

  83. Jose Luis dice:

    Supongo que el paquete no lleva las cabeceras simplemente por q no
    sale del proxy ya que estan en intranet…
    Corrijame si estoy errado… Gracias

  84. Patxi dice:

    En efecto Jose Luis, la función está pensada para su uso en internet. Si quieres obtener la dirección en una intranet local “sencilla” debería bastarte con utilizar REMOTE_ADDR. De todas formas yo encapsularía el acceso a esa variable en una función por si luego tienes que cambiar algo, para tocar solo un sitio.

    El caso en el que te da 127.0.0.1, ¿es cuando accedes al web desde el propio servidor que lo contiene?. Si es así tiene sentido ya que estaría accediendo a él a través del interfaz loopback.

  85. Esteban dice:

    Desde Argentina, fenomenal el artículo, la función y el trabajo de contestar todas las preguntas!!!!
    Grande Patxi!!!

  86. nikosoniko dice:

    Hola .. (tambien desde ARG.) muy bueno el articulo Patxi. De muchisima utilidad!. muy bien explicado. sos un fenomeno!

  87. foxmulder79 dice:

    Excelente. solo lo copie y pegue y funciono inmediatamente. Gracias.

  88. Antonio dice:

    Hola patxi, por lo que veo tu eres lo mejor que hay en el site, y yo soy el peor, necesito ayuda, soy extremadamente nuevo en esto del php, tengo php y mysql5, quiero guardar en mysql las dirección ip que visitan mi sitio, y despues manipularlo para presentar reportes,, pero no tengo idea, aqui psan muchas opiniones, pero no se cual me sirve a mi en especifico !! ya tengo un contadoy y escribe la ip de donde se conectan, pero no se como guardarla!! gracias!!

  89. Emi dice:

    Hola, me gustaria saber como encontrar el ip de un usuario en un foro? por favor ayudenme. GRACIAS

  90. Franco dice:

    Hola a todos!

    Solo me gustaria saber como pudo hacer para ver el numero de IP de los usuarios desde el msn messenger (windows live messenger)

    Gracias!

    Espero poder obtener la respuesta correcta!

    Saludos!!

  91. Dan dice:

    Buen trabajo el q realiza esta funcion , felicitaciones!!.
    Creo q esto tambien se puede hacer capturando la direccion MAC del cliente de la siguiente manera:

    $remoteIp = rtrim($_SERVER[’REMOTE_ADDR’]);
    $location = rtrim(`arp -a $remoteIp`);
    print_r($remoteIp.$location);//display

    $location = preg_replace(’/\s+/’, ’s’, $location);
    $location = split(’\s’,$location);//

    $num=count($location);//get num of array elements
    $loop=0;//start at array element 0
    while ($loopClient MAC Address:- “.$location[$loop].”";
    $_SESSION[’MAC’] = $loop;
    return;
    }
    else {$loop=$loop+1;}
    }

    quizas este codigo le sirva a alguien q al igual q yo desea la direecion mac.

    aunque si estas trabajando en una red bajo un servidor proxy creo q pasara lo mismo q en la funcion getRealip en donde si el servidor proxy es de alta confidencialidad solo se vera la dierccion mac de dicho proxy.

  92. Alberto dice:

    Muy bueno y muchas gracias

  93. IcedGuardian dice:

    Muy buen articulo
    En verdad que me parecio de mucha utilidad, me aclaro algunos conceptos que no tenia muy claros
    Se agradece
    SL2

  94. moggasd dice:

    Felicitaciones por el artículo, de verdad muy bueno!

    Salu!2

  95. Javier dice:

    Me pueden decir como hago para consegir el IP de una página web

  96. Paco dice:

    javier:

    desde una consola de msdos pon el comando
    ping “pagina web”
    ejemplo: ping www.yahoo.com

    al indicar los paquetes enviados propios del comando ping, te dara el IP de la direccion web , en este ejemplo la de yahoo….

  97. jesus dice:

    disculpen una preganta como puedo ocultar mi IP. = me lo detecta en la pagina, no se que hacer.
    E usado diferentes proxis tor, hide ip ani…
    ayuda porfavor q de debo hacer
    la pagina q bloqueo es cabal online no permite q me resgistre

  98. Roberto dice:

    Una pregunta como puedo saber el IP de un correo recibido desde un correo de Yahoo hay forma??
    Mil gracias me urge la información porque alguien esta acosando a mi novia y queremso saber la identidad de esta persona

    el correo de la otra persona es de hotmail

  99. Patricia dice:

    Yo ya tengo la IP pero se puede saber quien lo envio?? como puedo saber quien es la persona?? me urge esta informacion si alguien pudiera ayudarme por favor!!!

  100. Patricia dice:

    Hola Roberto, si se puede!! no se muy bien como se logra, alguien me ayudo a mandar mis correos de yahoo a outlook y ahi de alguna manera se ve la IP, espero esto te ayude.. aunque lo importante es saber como hacer para saber de quien es esa IP, si logras tenerla y saber como, te agradeceria me informaras, gracias!

  101. Nancy dice:

    Hola necesito ver la ip de un correo de hotmail alguien puede decirme como se ahce se lo agradecere mucho

  102. Augusto dice:

    Hola Patricia.

    Muy bueno el articulo y el script, gracias.

    Me pasa algo muy gracioso, pero que ya me tiene al borde del colapso existencial… y es que tu script me funcionaba perfectamente hasta hace poco, y de repente… empezo a mostrar un error en tiempo de ejecución…por sintaxis… justo en esta linea:

    reset($entries);

    lo que es extraño, pues antes funcionaba y ahora dice que hay error de sintaxis… y justo en esta linea donde no se ve nada…

    Que crees que pueda estar pasando?

    Saludos

  103. Miguel G dice:

    Hola
    Necesito ayuda,
    Ok ya tengo el php, yo quiero algo sencillo, que en una pagina html se muestre el ip de la persona que la abra.

    Gracias

    PD patricia y roberto lo que piden se hace muy sencillo, al bajar los correos por el outlook (tanto yahoo como hotmail se pueden bajar) solo tienes que dar click derecho al mensaje en outlook y ver las propiedades, en los detalles… origen del mensaje… y ya tienes al victimario

  104. Miguel G dice:

    Gracias Ya logre resolver

  105. Rafa dice:

    Patxi
    perdona mi ignorancia, pero en el codigo que pones al principio, ¿que he de hacer para todas las IP que recoja, volcarlas en una base de datos?
    Gracias

Deja un comentario