A veces nos encontramos con la necesidad de saber la IP de nuestro visitante y con usar la variable global $_SERVER[‘HTTP_REFERER’] puede sernos suficiente. Pero otras veces no y como dicen en la documentación de php:
HTTP_REFERER Está definido por el agente de usuario. No todos los agentes de usuarios lo definen y algunos permiten modificar HTTP_REFERER como parte de su funcionalidad. En resumen, es un valor del que no se puede confiar realmente.
Esto es así porque el usuario puede estar detrás de un servidor Proxy (o varios) que puede enmascarar la IP e incluso llegar a ocultarla, en cuyo caso no podríamos obtener la IP real del usuario, no obstante, se lo ponemos un poco más dificil para esconderse
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
/** * Intenta detectar la IP real del usuario. * * @param: None * @return: string $client_ip || NULL */ function getRealIP() { // Si existe HTTP_X_FORWARDED_FOR es un proxy. if ($_SERVER['HTTP_X_FORWARDED_FOR'] != '') { $client_ip = (!empty($_SERVER['REMOTE_ADDR'])) ? $_SERVER['REMOTE_ADDR'] : ((!empty($_ENV['REMOTE_ADDR'])) ? $_ENV['REMOTE_ADDR'] : null); /** * 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 = preg_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'] : null); } return $client_ip; } |
Comments are closed.