Obter o real endereço IP do cliente usando PHPOlá,

Muitos desenvolvedores utilizam a função para obter o endereço de IP do cliente usando PHP:

SERVER['REMOTE_ADDR'];

$_SERVER é um array contendo informação como cabeçalhos, paths, e localizações do script. As entradas neste array são criadas pelo servidor web. Não há garantia que cada servidor web proverá algum destes.

No entanto, em alguns casos, o endereço de IP obtido não é o real. Recentemente esta função retornava o meu endereço de IP local (192.168.1.130) em vez do meu endereço de IP público que pode ser facilmente obtido pelo www.meuip.com.br. Por outro lado, já na minha residência, retornava o IP corretamente. Como não podemos ter funções que, ora funcionam e, ora não funcionam, resolvi pesquisar e a solução foi a seguinte:

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

getenv retorna o nome da variável de ambiente varname, ou FALSE em caso de erro.

ou

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

     return $ipaddress; 
}

Enfim, funcionalidade de obtenção do real IP do usuário funcionando corretamente em minhas aplicações.

Nota:

Esta função não funciona no modo ISAPI. O Internet Server Application Programming Interface — ISAPI é um protocolo usado por computadores baseados no Windows para rodar uma aplicação dinâmica carregando um módulo externo no espaço de endereçamento do processo do webserver.

Espero que tenha ajudado.

Referências:

http://stackoverflow.com/questions/15699101/get-client-ip-address-using-php

Author

Rodrigo Calado é sócio-fundador e CTO do Gran Cursos Online. Graduado em Gestão da Tecnologia da Informação, pós-graduando em Governança de TI pela Universidade Católica de Brasília e cursou MBA em Gestão e Empreendedorismo pela FGV. Possui convicta paixão pela área de tecnologia, educação digital, concursos públicos e empreendedorismo.

7 Comments

  1. Marcilio Expedito Reply

    Olá!
    Não funcionou como esperado…
    Veja o que retornou Seu IP é: ::1
    O que faço para obter o IP correto

  2. Dejair Magalhães Sisconeto Reply

    Cara você não acha que fala de mais não?

Write A Comment