- vie 03 julio 2015
- web
- #web, #php, #script, #geolocalizacion, #headers, #cabeceras, #ip
Este script tiene 3 utilidades claras; Comprobar que un proxy sea anónimo 100% , comprobar que un proxy envie las cabeceras que tu necesites que envie y la geolocalización del cliente que hace la petición. Solamente se necesita configurar un virtual host en tu servidor web favorito para poder comprobar si realmente el proxy por el que estás navegado es anónimo y omite cabeceras que lo hace reconocerse como un proxy.
<?php
if (!function_exists('getallheaders')){
function getallheaders(){
$headers = '';
foreach ($_SERVER as $name => $value){
if (substr($name, 0, 5) == 'HTTP_'){
$headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
}
}
return $headers;
}
}
function getRealIP()
{
$dataShow = array();
if( isset($_SERVER['HTTP_X_FORWARDED_FOR']) )
{
$client_ip =
( !empty($_SERVER['REMOTE_ADDR']) ) ?
$_SERVER['REMOTE_ADDR']
:
( ( !empty($_ENV['REMOTE_ADDR']) ) ?
$_ENV['REMOTE_ADDR']
:
"unknown" );
$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) )
{
$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;
}
function getGeoIp($ip,$key = null){
$geoData = geoip_record_by_name($ip);
if(!empty($key) && array_key_exists($key, $geoData) ){
return $geoData[$key];
}
return $geoData;
}
function getInfo(){
$ip = "";
if( isset($_GET["ip"])){
$ip = $_GET["ip"];
}else{
$ip = getRealIP();
}
$dataShow["ip"] = $ip;
$dataShow["geo"] = getGeoIp($ip);
if(isset($_GET["headers"])){
$dataShow["headers"] = getallheaders();
}
if(isset($_GET["server"])){
$dataShow["server"] = $_SERVER;
}
echo json_encode($dataShow);
}
getInfo();
El primer grupo de código es la definición, en caso de que no exista, de la función getallheaders() . Esto simplemente devuelve los headers que ofrece el cliente, en este caso nuestro proxy, al servidor. En caso de que no exista la función en la versión de PHP que tenemos la define tal cual como explica en el manual de PHP http://php.net/manual/en/function.getallheaders.php
La función getRealIp() intenta sacar la IP del cliente que navega a través del proxy, en el caso de que al proxy se le haya escapado la IP en la cabecera HTTP_X_FORWARDED_FOR . También descarta las posibles IPs privadas ya que no ofrecen ninguna información.
La función getGeoIP() utiliza la libreria de geoip de maxmind para sacar el pais que devuelve la function getRealIP() . De esta forma podemos saber también si el proxy es de donde dice ser o de donde viene el cliente que usa el proxy en caso de que getRealIP() la encuentre. Este grupo de funciones se encuentra en esta libreria http://php.net/manual/es/book.geoip.php
La última función getInfo() se encarga de recopilar la información de las otras funciones y mostrarla en forma de json.
Por último deciros que cuando configureis el virtualhost, si le haces una petición simple, digamos que así: http://vuestrodominio.com/geoip/index.php . Os mostrará lo siguiente:
{
"ip":"0.0.0.0",
"geo": {
"continent_code":"EU",
"country_code":"ES",
"country_code3":"ESP",
"country_name":"Spain",
"region":"100",
"city":null,
"postal_code":"12222",
"latitude":40.000000,
"longitude":-0.000000000,
"dma_code":0,
"area_code":0
}
}
Simplemente os mostrará la info de la IP real y del geoip.
Si queréis que muestre los headers se lo especificais así: http://vuestrodominio.com/geoip/index.php?headers . Os saldrá lo siguiente:
{"ip":"0.0.0.0",
"geo": {
"continent_code":"EU",
"country_code":"ES",
"country_code3":"ESP",
"country_name":"Spain",
"region":"100",
"city":null,
"postal_code":"12222",
"latitude":40.000000,
"longitude":-0.000000000,
"dma_code":0,
"area_code":0
},
"headers": {
"Host":"http://vuestrodominio.com/geoip/index.php",
"User-Agent":"Mozilla\/5.0 (X11; Linux x86_64; rv:35.0) Gecko\/20100101 Firefox\/35.0","Accept":"text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8",
"Accept-Language":"es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3",
"Accept-Encoding":"gzip, deflate",
"Connection":"keep-alive"
}
}
En este caso he entrado con un firefox. Por lo tanto me aprece en las cabeceras la info que envia mi firefox. Pero ahí os saldrán las vuestras de vuestra propia petición.