Obter o Endereço IP de um visitante em PHP (Exemplo prático)

Se você precisa obter o endereço IP de um usuário, neste artigo você terá alguns exemplos de código para fazer isso.

Por via de regra, a variável $_SERVER['REMOTE_ADDR'] deve retornar o IP real do usuário para a maioria dos casos.

Porém, não é sempre que essa variável vai retornar o IP real do usuário, confira mais abaixo outros casos de uso e ressalvas sobre obter o endereço IP.

Obtendo o endereço IP

Código padrão para obter endereço IP de forma confiável:

echo $_SERVER['REMOTE_ADDR'];

Caso você esteja obtendo valores como ::1 ou 127.0.0.1 com o código acima, é simplesmente porque você está testando em localhost. Para obter o IP remoto real, você precisa hospedar seu código em um servidor.

Variáveis HTTP_CLIENT_IP e HTTP_X_FORWARDED_FOR

Apesar de muitos códigos de exemplo na internet usarem HTTP_CLIENT_IP e HTTP_X_FORWARDED_FOR como fallback, eu não recomendo fazer isso, pelo simples motivo que tratar essas variáveis deixa uma brecha de segurança, uma vez que o usuário pode setar esses valores que começam com HTTP_ no cabeçalho da requisição.

IP da Cloudflare ou sempre o mesmo IP sendo retornado

Se você está tentando obter o próprio IP e ele parece diferente do seu IP remoto real, ou é retornado sempre o mesmo IP, pode ser que seja porque seu servidor usa um proxy, como é o caso de todos os sites que usam Cloudflare. Neste caso você está obtendo o IP da Cloudflare.

Se esse for o caso, para obter o IP do usuário, você pode usar a seguinte variável:

echo $_SERVER['HTTP_CF_CONNECTING_IP'];

// Se preferir usar sempre a variável $_SERVER['REMOTE_ADDR'], você pode verificar e setar antes.
if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) {
	$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CF_CONNECTING_IP'];
}

Lembre-se de oferecer suporte à IPv6

Lembre-se que para salvar o IP em uma coluna do banco de dados, você precisa de 45 caracteres, uma vez que muitos endereços serão obtidos no formato IPv6.

Obtendo o IP em frameworks PHP

Em frameworks como Laravel ou Symfony, podem existir métodos para obter o endereço IP que já vem com alguns fallbacks para o uso de proxy, etc.

Laravel:

// Adicione ao namespace, caso necessário:
use Illuminate\Http\Request;

// Para obter o IP
echo Request::ip();

Symfony:

$request = Request::createFromGlobals();
echo $request->getClientIp();


Este artigo foi útil pra você?

Ricardo Metring

Ricardo Metring

Sou desenvolvedor full stack e co-fundador da Criar.io.
Trabalho há 10 anos com programação e sempre interessado em aprender mais.

Linkedin     Github

Artigos relacionados