Como pegar endereço IP real com PHP?

Vou mostrar nesse tutorial básico e simples de como pegar o endereço IP real dos visitantes de seu site utilizando PHP, incluindo observações de segurança.Pegar o IP real dos visitantes pode ser importante por diversas razões, por exemplo, login, geo targeting, redirecionamento, etc. Toda informação relevante sobre IP pode ser encontrada no array $_SERVER. O caminho mais simples para pegar o endereço IP de seus visitantes é com o código a seguir:

<?php

$ip = $_SERVER['REMOTE_ADDR'];

echo $ip;

?>

No entanto essa solução não é totalmente precisa, pois se o usuário estiver em uma conexão utilizando servidor proxy, então o IP que você obterá será o do servidor proxy e não o endereço IP real do usuário. Felizmente podemos fazer um refinamento adicional para obter resultados mais precisos. Os servidores proxy trazem no cabeçalho HTTP uma propriedade que armazena o IP original. O nome deste campo é X-Forwarded-For ou Client-Ip. Se um destes campos estiver presente no cabeçalho HTTP, entãovocê pode ler os seus valores através do array $_SERVER como no primeiro exemplo. Você precisa então checar todas estas 3 possibilidades abaixo:

<?php

echo "Remote addr: " .$_SERVER['REMOTE_ADDR'] . "<br/>";

echo "X Forward: " . $_SERVER['HTTP_X_FORWARDED_FOR'] . "<br/>";

echo "Clien IP: " . $_SERVER['HTTP_CLIENT_IP'] . "<br/>";

?>

Usando essa informação fica muito fácil criar uma simples função que irá retornar o  “provavelmente  verdadeiro*” IP do visitante do site:

<?php

function getIp()
{

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

    }

    return $ip;

}

?>

Simples, mas não podemos usar somente esta forma para fins de segurança em nosso site. Veja a observação logo abaixo.

*Observação:
Porque eu disse “provavelmente verdadeiro” logo acima do último bloco de código?
Como os valores de X_Forwarded_For e Client_Ip não são 100% confiáveis, pois é muito fácil manipular esses valores, como por exemplo, utilizando de uma simples instalação de um plugin do Firefox para alterar as informações de cabeçalho, seria possível burlar a verificação de IP. Devido à isso não podemos usar somente a verificação de IP para aplicações e soluções de segurança.

    $ip = $_SERVER['REMOTE_ADDR'];

Tópicos relacionandos

Publicado por

Razor

Conhecedor das artes gráficas, amante de design web, amigo íntimo do desenvolvimento web, com a pretensão de aprender e ajudar à quem busca conhecimento, me faço presente. =)

12 comentários sobre “Como pegar endereço IP real com PHP?”

  1. Isso aí para mim é novidade, não sabia que os proxys enviavam esses cabeçalhos. Mas deixa eu te dar uma idéia, eu tenho uma forma de tornar isso seguro. Montar uma boa lista com os ips dos proxys mais utilizados, daí verifica se o IP de $_SERVER[‘REMOTE_ADDR’] está na lista, se estiver aí sim pode pegar o IP dos outros cabeçalhos. Creio que dessa forma fica 100% seguro, porque você pegará o IP nos outros cabeçalhos somente quando tiver certeza que o meliante está usando proxy.

    Se o meliante estiver manipulando os cabeçalhos, logicamente o IP real dele não estará na sua lista de proxys. É o caso de gravar o IP do REMOTE_ADDR juntamente com o IP que aparecer nos cabeçalhos manipulados e marcá-lo como suspeito, porque das duas uma, ou ele manipulou ou de fato utilizou algum proxy não muito conhecido. Daí o negócio é pegar os hostnames também junto com o IPs para uma análise…

    Dá para pegar muitos meliantes com isso aí, difícil alguém escapar… ou o meliante é declarado culpado logo de cara ou entra para a lista dos suspeitos. kkkk

    1. Legal @Muller, na verdade quanto mais filtrar melhor e maiores as chances do IP ser real.
      Como você já mencionou, usar faixas de IP tbm, ajuda a filtrar. Entre outras coisas.
      O básico ta aí, em cima disso da pra melhorar e muito.
      ;)

  2. Bom dia a todos, alguém saberia dizer se tem como pegar o IP/Nome do micro do usuário?
    Não o do Servidor de Hospedagem e nem o da Internet. O do micro que o usuário estiver usando. Tipo/; 192.168.0.30

  3. Não entendo muito de informática..não entendí. Gostaria de saber os endereços de IP´s Tipo/; 192.168.0.30 , que visitam o meu site, (relatar como devo fazer bem detalhado). Gostaria de saber o que devo fazer, grato.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *