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();