servidor real obtener http_client_ip direccion detectar con capturar php security proxy ip reverse-proxy

real - obtener mi ip en php



PHP es la forma más precisa/segura de obtener una dirección IP de usuario real en 2017 (9)

Como el método real es verificar que la IP del usuario es $ip = $_SERVER[''REMOTE_ADDR''];

Si el usuario utiliza VPN o cualquier proxy, no detectará la IP original.

¿Cuál es la forma más precisa de obtener la dirección IP del usuario en 2017 a través de PHP?

He leído muchas preguntas y respuestas de SO, pero la mayoría de las respuestas son antiguas y los usuarios comentan que estas formas no son seguras.

Por ejemplo, observe esta pregunta (2011): ¿Cómo obtener la dirección IP del cliente en PHP?

La respuesta de Tim Kennedy contiene una recomendación para usar algo como:

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'']; }

Pero como he leído mucho, he visto que usar X_FORWARDED_FOR no es seguro, como se destaca en el comentario a continuación:

NO use el código anterior a menos que sepa EXACTAMENTE lo que hace. He visto agujeros de seguridad masivos debido a esto. El cliente puede configurar el encabezado X-Forwarded-For o Client-IP a cualquier valor arbitrario que desee. A menos que tenga un proxy inverso de confianza, no debe usar ninguno de esos valores.

Como no sabía EXACTAMENTE lo que hace, no quiero correr el riesgo. Dijo que no es seguro, pero no proporcionó un método seguro para obtener la dirección IP del usuario.

He probado el simple $_SERVER[''REMOTE_ADDR'']; , pero esto devuelve la IP incorrecta. He probado esto y mi IP real sigue este patrón: 78.57.xxx.xxx , pero obtengo una dirección IP como: 81.7.xxx.xxx

¿Tienes alguna idea?


Desde un punto de vista de seguridad, nada más que $_SERVER[''REMOTE_ADDR''] es confiable. Desafortunadamente, esa es la simple verdad.

Todas las variables con el prefijo HTTP_ son de hecho encabezados HTTP enviados por el cliente, y no hay otra manera de transferir esa información mientras las solicitudes pasan a través de diferentes servidores.
Pero eso, por supuesto, significa automáticamente que los clientes pueden falsificar esos encabezados.

Nunca, nunca, puedes confiar en el cliente.

A menos que sea usted ... Si controla el proxy o el equilibrador de carga, es posible configurarlo para que elimine dichos encabezados de la solicitud original.
Entonces, y solo entonces, podría confiar en un encabezado, por ejemplo, X-Client-IP , pero realmente, no hay necesidad de hacerlo en ese momento ... su servidor web también puede configurarse para reemplazar REMOTE_ADDR con ese valor y todo el proceso se vuelve transparente para tú.

Este siempre será el caso, sin importar en qué año estemos ... por cualquier cosa relacionada con la seguridad, solo confíe en REMOTE_ADDR .
El mejor de los casos es leer los datos HTTP_ solo con fines estadísticos , e incluso entonces, asegúrese de que la entrada sea al menos una dirección IP válida.


En primer lugar, es imposible determinar de manera confiable la dirección IP de origen de alguien si tienen la intención de ocultarse. Incluso algo que hoy parece infalible, pronto tendrá una laguna (si es que ya no lo tiene). Como tal, cualquier respuesta a continuación debe ser considerada SIN CONFIANZA , lo que significa que si pone todos sus huevos en esta canasta, prepárese para que alguien la aproveche o la eluda de alguna manera.

No voy a entrar en todas las formas en que alguien puede eludir el seguimiento de IP, ya que está en constante evolución. Lo que diré es que puede ser una herramienta útil para el registro, siempre y cuando sepa que las direcciones IP pueden cambiar fácilmente o estar enmascaradas.

Ahora, un punto importante es que hay una diferencia entre una dirección IP pública y una dirección IP privada. En IPV4, a los enrutadores generalmente se les asigna una dirección IP pública, que es todo lo que un lenguaje del lado del servidor puede tomar, porque no ve su dirección IP del lado del cliente. Para un servidor, su computadora no existe como un espacio web. En su lugar, su enrutador es todo lo que importa. A su vez, su enrutador es lo único que se preocupa por su computadora y le asigna una dirección IP privada (a la que pertenece su dirección 172... *) Para hacer que esto funcione. Esto es bueno para usted, porque no puede acceder directamente a una computadora detrás de un enrutador.

Si desea acceder a una dirección IP privada, necesita usar JavaScript (idioma del lado del cliente). A continuación, puede almacenar los datos de forma asíncrona a través de AJAX. Por lo que sé, esto solo es posible actualmente usando Chrome y Firefox habilitados para WebRTC. Vea here para una demostración.

He probado esto y devuelve direcciones IP privadas. Por lo general, creo que esto lo usan los anunciantes para ayudar a rastrear usuarios individuales en una red, junto con la dirección IP pública. Estoy seguro de que rápidamente se volverá inútil a medida que la gente crea soluciones alternativas o cuando la indignación pública los obligue a ofrecer la posibilidad de deshabilitar la API de WebRTC. Sin embargo, por el momento funciona para cualquier persona que tenga JavaScript habilitado en Chrome y Firefox.

Más lectura:


Que tal este -

public function getClientIP() { $remoteKeys = [ ''HTTP_X_FORWARDED_FOR'', ''HTTP_CLIENT_IP'', ''HTTP_X_FORWARDED'', ''HTTP_FORWARDED_FOR'', ''HTTP_FORWARDED'', ''REMOTE_ADDR'', ''HTTP_X_CLUSTER_CLIENT_IP'', ]; foreach ($remoteKeys as $key) { if ($address = getenv($key)) { foreach (explode('','', $address) as $ip) { if ($this->isValidIp($ip)) { return $ip; } } } } return ''127.0.0.0''; } private function isValidIp($ip) { if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) && !filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE) ) { return false; } return true; }


Si desea utilizar una biblioteca pre-construida, puede usar Whip .

El uso de bibliotecas prefabricadas suele ser mejor porque la mayoría de ellas habrá sido revisadas minuciosamente por una comunidad activa. Algunos de ellos, especialmente los que han existido durante mucho tiempo, tienen más funciones incorporadas.

Pero si desea codificarlo usted mismo para aprender el concepto, entonces está bien, supongo. Recomiendo empaquetarlo como una biblioteca independiente y lanzarlo como código abierto :)

EDITAR: No recomiendo usar la IP remota en mecanismos de seguridad ya que no siempre son confiables.


Tienes que colaborar con tu equipo de sysops (o si también llevas ese sombrero, necesitarás investigar un poco). La verificación de encabezado se usa cuando su infraestructura de red está configurada de ciertas maneras donde el solicitante remoto es uno de sus dispositivos de red en lugar del usuario final.

Este tipo de cosas sucede cuando su servidor web se encuentra detrás de un equilibrador de carga o un servidor de seguridad u otro dispositivo que necesite interrogar la carga útil para manejarlo adecuadamente. Un ejemplo es cuando un equilibrador de carga finalizó ssl y reenvía la solicitud al servidor web sin ssl. Cuando esto ocurre, la dirección remota se convierte en el equilibrador de carga. También sucede con los dispositivos de firewall que hacen lo mismo.

En la mayoría de los casos, el dispositivo ofrecerá la configuración para establecer un valor de encabezado en la solicitud con la dirección IP remota original. El encabezado suele ser lo que usted esperaría, pero en algunos casos puede ser diferente o incluso configurable.

Además, dependiendo de la configuración de su servidor web (apache, nginx u otro) puede que no sea compatible o esté configurado actualmente para admitir ciertos encabezados personalizados, como el encabezado de IP común.

El punto es que deberás investigar tu configuración de red para asegurarte de que la ip del solicitante original llegue hasta el código de tu aplicación y en qué forma.


Yo uso este código, y funciona para mí. Échale un vistazo.

<?php // Gets client''s IP. $ip = getenv("HTTP_CLIENT_IP")?: getenv("HTTP_X_FORWARDED_FOR")?: getenv("HTTP_X_FORWARDED")?: getenv("HTTP_FORWARDED_FOR")?: getenv("HTTP_FORWARDED")?: getenv("REMOTE_ADDR"); echo $ip; ?>

Here , un ejemplo de trabajo. ¡Espero eso ayude!


Obtener la dirección IP del cliente:

<?php echo $ip = $_SERVER[''REMOTE_ADDR'']; ?>

Nota :: Esto solo funcionaría en el sitio en vivo, porque en su host local su IP sería una (1) de las direcciones IP internas, como 127.0.0.1 Por lo tanto, su retorno :: 1

Ejemplo: https://www.virendrachandak.com/demos/getting-real-client-ip-address-in-php.php

Es mostrar su IP local: como ... 78.57.xxx.xxx

Ejemplo:

<?php $myIp= getHostByName(php_uname(''n'')); echo $myIp; ?>


Respuesta corta:

$ip = $_SERVER[''REMOTE_ADDR''];

A partir de 2019 $_SERVER[''REMOTE_ADDR'']; es la única solución confiable para obtener la dirección IP de los usuarios , pero puede mostrar resultados erróneos si está detrás de un servidor proxy.
Todas las demás soluciones implican riesgos de seguridad o se pueden falsificar fácilmente .