Obtener la ip del usuario con php
- Detalles
- Categoría: Programación
- Última actualización el Sábado, 07 Enero 2012 11:50
- Escrito por cybnet
- Visto: 3013
Vamos a ver como obtener la ip de un usuario de tu pagina web con php utilizando la variable superglobal $_SERVER y, alternativamente, la función para obtener variables de entorno getenv().
Tanto $_SERVER, como getenv(), están siempre disponibles en cualquier parte de nuestro código, la primera por ser una variable superglobal y la segunda por ser una función php predefinida.
La IP es una etiqueta consistente en números que identifica al elemento de comunicación de un dispositivo dentro de una red que utilice el protocolo IP (Internet Protocol). En nuestro caso, el dispositivo es un ordenador y la red es Internet. En php existen varias variables que pueden contener la dirección IP de un ordenador, esto es, la dirección del usuario de nuestra página web que es lo que queremos conseguir. Estas variables son todas accesibles a través del array que es la variable superglobal $_SERVER (array de variables de entorno de servidor). No obstante pueden existir algunas situaciones en que no obtengamos la información deseada a través de esta variable y para ello utilizaremos la función getenv(), función que devuelve variables de entorno, entre ellas la dirección IP de nuestro usuario objetivo.
Veamos pues el código de la función que nos serviría para obtener la dirección IP del usuario que visita nuestra web:
<?php
function GetUserIp()
{
$ip = "";
if(isset($_SERVER)) {
if (!empty($_SERVER['HTTP_CLIENT_IP']))
{
$ip=$_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip=$_SERVER['REMOTE_ADDR'];
}
} else {
if ( getenv( 'HTTP_CLIENT_IP' ) ) {
$ip = getenv( 'HTTP_CLIENT_IP' );
} elseif ( getenv( 'HTTP_X_FORWARDED_FOR' ) ) {
$ip = getenv( 'HTTP_X_FORWARDED_FOR' );
} else {
$ip = getenv( 'REMOTE_ADDR' );
}
}
// En algunos casos muy raros la ip es devuelta repetida dos veces separada por coma
if(strstr($ip,','))
{
$ip = array_shift(explode(',',$ip));
}
return $ip;
}
?>
En el código superior comprobamos que exista la variable superglobal $_SERVER y vamos comprobando la existencia de las distintas variables que nos pueden devolver el valor de la IP del usuario hasta que encontremos el valor. Si la variable $_SERVER no existe usaremos el mismo bucle de comprobación con la función getenv().
¿¿¿Por qué pongo 'REMOTE_ADDR' como la última opción????
La variable de entorno REMOTE_ADDR ha sido siempre la más comúnmente usada para obtener la IP de un usuario web. Debido a errores en la implementación de reCaptcha en una web, y tras darle muchas vueltas a la cabeza, descubrí que se trataba de que esta variable no estaba devolviendo el valor real de la IP, o simplemente el valor era nulo, dando como resultado errores en la comunicación con el servidor de reCaptcha para realizar la comprobación del código. Concretamente el error era "Su sesión ha expirado o su navegador no acepta cookies....", error que no era real. Así que me puse a investigar un poco......
Veamos que puede ocurrir con la variable REMOTE_ADDR. Inicialmente REMOTE_ADDR contiene la IP del usuario junto la variable HTTP_CLIENT_IP (si existe). Si el usuario pasa por un proxy o por un sistema de cache de algunos servidores, la IP que contiene la variable REMOTE_ADDR no es la del cliente si no la del proxy o sistema intermedio. La IP del cliente es añadida a la variable HTTP_X_FORWARDED_FOR.
Si lees el párrafo anterior entenderás que lo primero será comprobar si hay valor para HTTP_CLIENT_IP, porque si lo hay esto es lo que buscamos. A pesar de que exista este valor, si la variable HTTP_X_FORWARDED_FOR no está vacía significa que el cliente a pasado por un sistema intermedio que ha cambiado las cabeceras y el valor de IP que buscamos es este. Si llegamos ha este punto sin éxito probaremos con REMOTE_ADDR, variable que contendrá la IP real de nuestro usuario, si sólo y sólo si, las otras dos están vacías o no existen.
IP - Internet Protocol - php - programación - $_SERVER - getenv - REMOTE_ADDR - HTTP_CLIENT_IP - HTTP_X_FORWARDED_FOR





RSS

Perfil
Artículos
RSS