¿Cómo obtener la dirección IP del cliente en PHP?


Answers

$_SERVER['REMOTE_ADDR'] puede que no contenga direcciones IP reales del cliente, ya que le dará una dirección proxy para clientes conectados a través de un proxy, por ejemplo. Eso bien puede ser lo que realmente quieres, dependiendo de lo que hagas con los IP. La dirección RFC1918 privada de alguien puede no servirle de nada, por ejemplo, tratando de ver de dónde se origina el tráfico, o recordando de qué IP se conectó el usuario por última vez, donde la IP pública del proxy o la puerta de enlace NAT podría ser más apropiado para almacenar

Hay varios encabezados HTTP como X-Forwarded-For que pueden o no ser configurados por varios proxies. El problema es que esos son simplemente encabezados HTTP que cualquier persona puede configurar. No hay garantía sobre su contenido. $_SERVER['REMOTE_ADDR'] es la dirección IP física real de la que el servidor web recibió la conexión y a la que se enviará la respuesta. Cualquier otra cosa es solo información arbitraria y voluntaria. Solo hay un escenario en el que puede confiar en esta información: está controlando el proxy que establece este encabezado. Es decir, solo si sabes al 100% dónde y cómo se configuró el encabezado, si lo haces por algo importante.

Habiendo dicho eso, aquí hay un código de muestra:

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

Nota del editor: Usar el código anterior tiene implicaciones de seguridad . El cliente puede configurar toda la información del encabezado HTTP (es decir, $_SERVER['HTTP_... ) a cualquier valor arbitrario que desee. Como tal, es mucho más confiable usar $_SERVER['REMOTE_ADDR'] , ya que el usuario no puede establecerlo.

De: http://roshanbh.com.np/2007/12/getting-real-ip-address-in-php.html

Question

¿Cómo puedo obtener la dirección IP del cliente usando PHP?

Quiero mantener un registro del usuario que inició sesión en mi sitio web a través de su dirección IP.




Me gusta este codenippet:

function getClientIP() {

    if (isset($_SERVER)) {

        if (isset($_SERVER["HTTP_X_FORWARDED_FOR"]))
            return $_SERVER["HTTP_X_FORWARDED_FOR"];

        if (isset($_SERVER["HTTP_CLIENT_IP"]))
            return $_SERVER["HTTP_CLIENT_IP"];

        return $_SERVER["REMOTE_ADDR"];
    }

    if (getenv('HTTP_X_FORWARDED_FOR'))
        return getenv('HTTP_X_FORWARDED_FOR');

    if (getenv('HTTP_CLIENT_IP'))
        return getenv('HTTP_CLIENT_IP');

    return getenv('REMOTE_ADDR');
}



Mi solución favorita es la forma en que Zend Framework 2 usa. También considera las propiedades $_SERVER HTTP_X_FORWARDED_FOR , HTTP_CLIENT_IP , HTTP_CLIENT_IP , pero declara una clase para que establezca algunos proxies de confianza y devuelve una dirección IP, no una matriz. Creo que esta es la solución que más se acerca:

class RemoteAddress
{
    /**
     * Whether to use proxy addresses or not.
     *
     * As default this setting is disabled - IP address is mostly needed to increase
     * security. HTTP_* are not reliable since can easily be spoofed. It can be enabled
     * just for more flexibility, but if user uses proxy to connect to trusted services
     * it's his/her own risk, only reliable field for IP address is $_SERVER['REMOTE_ADDR'].
     *
     * @var bool
     */
    protected $useProxy = false;

    /**
     * List of trusted proxy IP addresses
     *
     * @var array
     */
    protected $trustedProxies = array();

    /**
     * HTTP header to introspect for proxies
     *
     * @var string
     */
    protected $proxyHeader = 'HTTP_X_FORWARDED_FOR';

    // [...]

    /**
     * Returns client IP address.
     *
     * @return string IP address.
     */
    public function getIpAddress()
    {
        $ip = $this->getIpAddressFromProxy();
        if ($ip) {
            return $ip;
        }

        // direct IP address
        if (isset($_SERVER['REMOTE_ADDR'])) {
            return $_SERVER['REMOTE_ADDR'];
        }

        return '';
    }

    /**
     * Attempt to get the IP address for a proxied client
     *
     * @see http://tools.ietf.org/html/draft-ietf-appsawg-http-forwarded-10#section-5.2
     * @return false|string
     */
    protected function getIpAddressFromProxy()
    {
        if (!$this->useProxy
            || (isset($_SERVER['REMOTE_ADDR']) && !in_array($_SERVER['REMOTE_ADDR'], $this->trustedProxies))
        ) {
            return false;
        }

        $header = $this->proxyHeader;
        if (!isset($_SERVER[$header]) || empty($_SERVER[$header])) {
            return false;
        }

        // Extract IPs
        $ips = explode(',', $_SERVER[$header]);
        // trim, so we can compare against trusted proxies properly
        $ips = array_map('trim', $ips);
        // remove trusted proxy IPs
        $ips = array_diff($ips, $this->trustedProxies);

        // Any left?
        if (empty($ips)) {
            return false;
        }

        // Since we've removed any known, trusted proxy servers, the right-most
        // address represents the first IP we do not know about -- i.e., we do
        // not know if it is a proxy server, or a client. As such, we treat it
        // as the originating IP.
        // @see http://en.wikipedia.org/wiki/X-Forwarded-For
        $ip = array_pop($ips);
        return $ip;
    }

    // [...]
}

Vea el código completo aquí: https://raw.githubusercontent.com/zendframework/zend-http/master/src/PhpEnvironment/RemoteAddress.php




 $_SERVER['REMOTE_ADDR'];

prueba este




Debería estar contenido en la variable $_SERVER['REMOTE_ADDR'] .




Como sé, la forma más sencilla de obtener la dirección IP del visitante / cliente es usar las variables $ _SERVER ['REMOTE_ADDR'] o $ _SERVER ['REMOTE_HOST'] .

Sin embargo, a veces esto no devuelve la dirección IP correcta del visitante, por lo que podemos utilizar algunas otras variables del servidor para obtener la dirección IP.

Las siguientes funciones son equivalentes con la diferencia solo en cómo y desde dónde se recuperan los valores.

getenv() se usa para obtener el valor de una variable de entorno en PHP.

// Function to get the client IP address

    function get_client_ip() {
    $ipaddress = '';
    if (getenv('HTTP_CLIENT_IP'))
        $ipaddress = getenv('HTTP_CLIENT_IP');
    else if(getenv('HTTP_X_FORWARDED_FOR'))
        $ipaddress = getenv('HTTP_X_FORWARDED_FOR');
    else if(getenv('HTTP_X_FORWARDED'))
        $ipaddress = getenv('HTTP_X_FORWARDED');
    else if(getenv('HTTP_FORWARDED_FOR'))
        $ipaddress = getenv('HTTP_FORWARDED_FOR');
    else if(getenv('HTTP_FORWARDED'))
       $ipaddress = getenv('HTTP_FORWARDED');
    else if(getenv('REMOTE_ADDR'))
        $ipaddress = getenv('REMOTE_ADDR');
    else
        $ipaddress = 'UNKNOWN';
    return $ipaddress;
}

$ _SERVER es una matriz que contiene variables de servidor creadas por el servidor web.

// Function to get the client IP address

    function get_client_ip() {
    $ipaddress = '';
    if (isset($_SERVER['HTTP_CLIENT_IP']))
        $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
    else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
        $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
    else if(isset($_SERVER['HTTP_X_FORWARDED']))
        $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
    else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
        $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
    else if(isset($_SERVER['HTTP_FORWARDED']))
        $ipaddress = $_SERVER['HTTP_FORWARDED'];
    else if(isset($_SERVER['REMOTE_ADDR']))
        $ipaddress = $_SERVER['REMOTE_ADDR'];
    else
        $ipaddress = 'UNKNOWN';
    return $ipaddress;
}



Esta función es compacta y puede usarla en cualquier lugar. Pero !

¡No olvide esto! En este tipo, las funciones o los bloques de código no garantizan el registro de la IP real del usuario, ya que algunos usuarios pueden usar el proxy u otras puertas de enlace de forma segura para ser invisibles o no pueden rastrear.

Función Php:

function GetIP()
{
    if ( getenv("HTTP_CLIENT_IP") ) {
        $ip = getenv("HTTP_CLIENT_IP");
    } elseif ( getenv("HTTP_X_FORWARDED_FOR") ) {
        $ip = getenv("HTTP_X_FORWARDED_FOR");
        if ( strstr($ip, ',') ) {
            $tmp = explode(',', $ip);
            $ip = trim($tmp[0]);
        }
    } else {
        $ip = getenv("REMOTE_ADDR");
    }
    return $ip;
}

Uso:

$IP = GetIP(); o directamente GetIP();




La respuesta es usar la variable $_SERVER . Por ejemplo, $_SERVER["REMOTE_ADDR"] devolvería la dirección IP del cliente.




$_SERVER['REMOTE_ADDR'];

Ejemplo:

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



Como todos los demás dijeron antes, puede usar $_SERVER['REMOTE_ADDR']; para obtener la dirección IP del cliente.

Además, si necesita más información sobre un usuario, puede usar esto:

<?php
    $ip='0.0.0.0';
    $ip=$_SERVER['REMOTE_ADDR'];
    $clientDetails = json_decode(file_get_contents("http://ipinfo.io/$ip/json"));
    echo "You're logged in from: <b>" . $clientDetails->country . "</b>";
?>

La información más específica del cliente va en $ clientDetails.
Puede buscar elementos json almacenados en la variable $ clientDetails de esta manera: $ clientDetails-> PostalCode / hostname / region / loc ...

Estoy usando ipinfo.io para obtener información adicional.

Espero que ayude.




¿¿¿¿Como eso????

if(($ip=filter_input(INPUT_SERVER,'REMOTE_ADDR',validate_ip))===false or empty($ip)){
  exit;
  }
echo $ip;

PD

if(($ip=filter_input(INPUT_SERVER,'REMOTE_ADDR',FILTER_VALIDATE_IP|FILTER_FLAG_NO_PRIV_RANGE|FILTER_FLAG_NO_RES_RANGE))===false){
  header('HTTP/1.0 400 Bad Request');
  exit;
}

Todos los encabezados que comiencen con 'HTTP_' o 'X-' pueden ser falsos, respectivamente, definidos por el usuario. Si quieres hacer un seguimiento usa cooies, etc.