New question

Question:

Date: 16-08-2015 23:57:10 (In Spanish)

php get real ip proxy[Resolved]

Recientemente, en Geolocalización IP mostraba un código para obtener la IP real del usuario, ante la posibilidad de que utilice un acceso mediante PROXY.

Dejaba la puerta abierta a una mejora de dicho código.

Ante su fallo al utilizar proxys tales como zend2 o kproxy me ha parecido oportuno indagar sobre el tema.

La mejor explicación que he visto en php-get-real-ip-proxy-detection es ésta:
Si el proxy envía un encabezado entonces usted puede buscar el IP original del cliente. Si el proxy no lo hace, entonces usted no puede. Por desgracia (o tal vez afortunadamente dependiendo de su perspectiva) es tan simple como eso.

¿Alguna mejor explicación o mejora del código?

Gracias.

EDITO el código de referencia, aunque he visto variables (más simples y más complejas) siempre con el mismo resultado:
<?php
$IP='' ;
if (getenv('HTTP_CLIENT_IP')) {
       $IP=getenv('HTTP_CLIENT_IP');
} 
elseif (getenv('HTTP_X_FORWARDED_FOR')){
	$IP=getenv('HTTP_X_FORWARDED_FOR'); 
}
elseif (getenv('HTTP_X_FORWARDED')) {
	$IP=getenv('HTTP_X_FORWARDED'); 
}
elseif (getenv('HTTP_X_CLUSTER_CLIENT_IP')) {
	$IP=getenv('HTTP_X_CLUSTER_CLIENT_IP'); 
}
elseif (getenv('HTTP_FORWARDED_FOR')) {
	$IP=getenv('HTTP_FORWARDED_FOR');
}
elseif (getenv('HTTP_FORWARDED')) {
	$IP=getenv('HTTP_FORWARDED');
} 
else {
	$IP=$_SERVER[ 'REMOTE_ADDR']; 
} 
?>
Tags: IPv4 - IPv6 - PHP - Question Votes: 1 - Answers: 7 - Views: 13 Share on: Google Facebook Twitter LinkedIn Link
 

Answers:

  • Date: 20-08-2015 12:58:08 Y sí, hay una mejora para el código que llega de la mano de Javascript.

    La mecánica es la siguiente:
    1.- Genero mediante Javascript una cookie cuyo valor sea la IP del usuario.
    Ello lo realizo mediante la página http://api.hostip.info/get_html.php
    Al generarlo en la máquina del usuario, no existe posibilidad de error.
    2.- Recojo mediante PHP la cookie generada.
    3.- despliego los datos como lo hacía originalmente.

    He encontrado algunas páginas de proxi's que se desentienden de las cookies de la página original, generando las suyas. Pero por lo general, dicha barrera queda superada.
    En tales casos, la IP no queda registrada (en el caso anterior, mostraba las nueva IP del proxi). mostrando en todo caso que la página ha sido "intervenida"

    El enlace de prueba con el código original PHP: geolocation-IP2.php
    El nuevo enlace con la combinación de cookie desde javacript y porterior PHP: geolocation-IPcook.php

    Saludos.
      Votes: 1 - Link answer
     
  • Date: 20-08-2015 16:58:59 Muy bueno dato Artzain!

    Te comento que he probado los dos enlaces con estos resultados:
    geolocation-IP2.php <-- funciona, me situa en mi país pero las coordenadas no son correctas
    geolocation-IPcook.php <-- funciona, pero me situa en "Netherlands", por lo que toda la información es erronea.

    Saludos,
      Votes: 0 - Link answer
     
  • Date: 20-08-2015 19:29:40 Fernando:

    Lo comentaba: algunas páginas destruyen (o no recogen) las cookies de la página que redirige.

    De mis pruebas siempre con geolocation-IPcook.php:
    - Con https://zend2.com/, me sitúa en Madrid y no arroja IP.
    - Con http://www.kproxy.com/ (hay que recargar la página, por lo que tengo que depurar el código) me da la IP correcta. y mantiene la cookie generada. (en este caso es "userIP="+(ipAddress[1]);

    Falta, como dije, depurar el código.
      Votes: 1 - Link answer
     
  • Date: 24-08-2015 08:49:51 CONCLUSION:

    El código PHP para localizar la IP real (expuesto al inicio de la pregunta) puede ampliarse pero si es un servidor proxy anónimo no puedes hacer nada, nunca la obtendrás
    /* ... */
    elseif (getenv('HTTP_VIA')){
    	$IP=getenv('HTTP_VIA'); 
    }
    elseif (getenv('HTTP_USERAGENT_VIA')){
    	$IP=getenv('HTTP_USERAGENT_VIA'); 
    }
    elseif (getenv('HTTP_PROXY_CONNECTION')) {
    	$IP=getenv('HTTP_PROXY_CONNECTION');
    }
    elseif (getenv('HTTP_XPROXY_CONNECTION')) {
    	$IP=getenv('HTTP_XPROXY_CONNECTION');
    }
    /* ... */

    etc.

    La solución mediante cookie/javascript es válida (incluso mejorando PHP) ya que, en el peor de los casos, no recoge Javascript por lo que no genera la cookie en la página expuesta por proxy. Los proxy anónimos que se inician con https://, por lo general, lo ocultan todo y, curiosamente, generan sus propias cookies.

    Mis últimas pruebas de generación de cookie las he realizado con JQuery, apoyado en http://ipinfo.io/json con muy buenos resultados.

    Si no aparecen datos es una proxy. Y si aparecen, (eso creo) son los datos reales.

    Mi último enlace corregido (JQuery/cookie): .../geolocation-IPcook.php
      Votes: 2 - Link answer
     
  • Date: 24-08-2015 10:28:15 Muy interesante el jQuery Cookie Plugin

    /*!
     * jQuery Cookie Plugin v1.4.1
     * https://github.com/carhartl/jquery-cookie
     *
     * Copyright 2006, 2014 Klaus Hartl
     * Released under the MIT license
     */
    (function (factory) {
    	if (typeof define === 'function' && define.amd) {
    		// AMD (Register as an anonymous module)
    		define(['jquery'], factory);
    	} else if (typeof exports === 'object') {
    		// Node/CommonJS
    		module.exports = factory(require('jquery'));
    	} else {
    		// Browser globals
    		factory(jQuery);
    	}
    }(function ($) {
    
    	var pluses = /\+/g;
    
    	function encode(s) {
    		return config.raw ? s : encodeURIComponent(s);
    	}
    
    	function decode(s) {
    		return config.raw ? s : decodeURIComponent(s);
    	}
    
    	function stringifyCookieValue(value) {
    		return encode(config.json ? JSON.stringify(value) : String(value));
    	}
    
    	function parseCookieValue(s) {
    		if (s.indexOf('"') === 0) {
    			// This is a quoted cookie as according to RFC2068, unescape...
    			s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
    		}
    
    		try {
    			// Replace server-side written pluses with spaces.
    			// If we can't decode the cookie, ignore it, it's unusable.
    			// If we can't parse the cookie, ignore it, it's unusable.
    			s = decodeURIComponent(s.replace(pluses, ' '));
    			return config.json ? JSON.parse(s) : s;
    		} catch(e) {}
    	}
    
    	function read(s, converter) {
    		var value = config.raw ? s : parseCookieValue(s);
    		return $.isFunction(converter) ? converter(value) : value;
    	}
    
    	var config = $.cookie = function (key, value, options) {
    
    		// Write
    
    		if (arguments.length > 1 && !$.isFunction(value)) {
    			options = $.extend({}, config.defaults, options);
    
    			if (typeof options.expires === 'number') {
    				var days = options.expires, t = options.expires = new Date();
    				t.setMilliseconds(t.getMilliseconds() + days * 864e+5);
    			}
    
    			return (document.cookie = [
    				encode(key), '=', stringifyCookieValue(value),
    				options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
    				options.path    ? '; path=' + options.path : '',
    				options.domain  ? '; domain=' + options.domain : '',
    				options.secure  ? '; secure' : ''
    			].join(''));
    		}
    
    		// Read
    
    		var result = key ? undefined : {},
    			// To prevent the for loop in the first place assign an empty array
    			// in case there are no cookies at all. Also prevents odd result when
    			// calling $.cookie().
    			cookies = document.cookie ? document.cookie.split('; ') : [],
    			i = 0,
    			l = cookies.length;
    
    		for (; i < l; i++) {
    			var parts = cookies[i].split('='),
    				name = decode(parts.shift()),
    				cookie = parts.join('=');
    
    			if (key === name) {
    				// If second argument (value) is a function it's a converter...
    				result = read(cookie, value);
    				break;
    			}
    
    			// Prevent storing a cookie that we couldn't decode.
    			if (!key && (cookie = read(cookie)) !== undefined) {
    				result[name] = cookie;
    			}
    		}
    
    		return result;
    	};
    
    	config.defaults = {};
    
    	$.removeCookie = function (key, options) {
    		// Must not alter options, thus extending a fresh object...
    		$.cookie(key, '', $.extend({}, options, { expires: -1 }));
    		return !$.cookie(key);
    	};
    
    }));
    


    Aquí la última versión: https://plugins.jquery.com/cookie/

    Un ejemplo simple para el que lo quiere probar.

    $(document).ready(function () {
        $.getJSON('http://ipinfo.io/json', function (data) {
            alert(data.ip);
        });
    });
    


    Muchas gracias Artzain Haritz por compartir!

    Saludos,
    Fernando
      Votes: 1 - Link answer
     
  • Date: 24-08-2015 11:30:12 Fernando:

    Tu capacidad de síntesis es meritoria.

    Tres días míos light para que me lo resumas en dos líneas. Evidentemente soy diesel.

    (risas y llantos)

    El enlace http://ipinfo.io/json nos dice muchas cosas que personalmente ni lo sabía hasta esta incursión en el tema.
    (Ejemplo de mi IP: Org: AS12338 Euskaltel S.A.)
    Recuerda que tienes el enlace http://ipinfo.io/8.8.8.8/json donde 8.8.8.8 (cambiados los 8's a la IP deseada) es la IP de la que quieras obtener resultados.

    Cada tema es un mundo. Y que resucite Cervantes para volver a decirme que "no hay libro tan malo del que no haya algo que aprender" ...
      Votes: 1 - Link answer
     
  • Date: 25-08-2015 08:32:55 Algo que me gusto mucho de ipinfo.io son los terminos de uso:

    Terms of use
    This is all provided as-is, with no guarantees on availability or accuracy of the results. We'll certainly do our best to make the service highly-available though, and the results accurate. You can use it for any purpose. Attribution is not required, but is appreciated.


    Según el traductor de Google:

    Condiciones de uso
    Todo esto se proporciona como-es, sin ninguna garantía sobre la disponibilidad o la exactitud de los resultados. Sin duda, haremos nuestro mejor esfuerzo para que el servicio de alta disponibilidad sin embargo, y los resultados exactos. Se puede utilizar para cualquier propósito. No se requiere de Atribución, pero se agradece.


    Saludos!
      Votes: 1 - Link answer
     
To actively participate in the community first must authenticate, enter the system.Sign In