Como obter o endereço IP do usuário em PHP

Este é um tópico bastante simples. Apenas algumas linhas de código PHP farão o trabalho de obter o endereço IP do usuário. Na maioria das vezes é verdade, trata-se apenas de algumas linhas de script PHP.

Às vezes, as coisas ficam complicadas. Veremos sobre essas coisas e também um outro aspecto, como a questão da privacidade envolvida nisso.

Seguindo uma linha de código PHP, você obterá o endereço IP do usuário. Então, por que tanto barulho? Leia o artigo e você saberá sobre ele.

$_SERVER['REMOTE_ADDR'];

$ _SERVER é um array PHP que é definido pelo servidor. Dependendo dessa linha, o código PHP pode não produzir os melhores resultados em muitas situações. Por exemplo, se um cliente estiver atrás de um servidor proxy, essa variável não será adequada. Esteja ciente de que esses cabeçalhos podem ser facilmente falsificados pelos usuários, definindo eles próprios um endereço IP.

O seguinte script PHP cobre a maior parte do cenário e retorna o endereço IP do usuário.

<?php

class Request
{

    /**
     * Recupera o endereço IP definido no cabeçalho da solicitação.
     *
     * Cada ISPs os configura seguindo sua própria lógica. Também existe a possibilidade para o usuário
     * para falsificar facilmente seu endereço IP.
     *
     * Portanto, não é aconselhável usar isso para situações críticas.
     * Se você estiver obtendo o endereço IP para fins de registro casual, não há problema.
     */
    public function getIpAddress()
    {
        $ipAddress = '';
        if (! empty($_SERVER['HTTP_CLIENT_IP']) && $this->isValidIpAddress($_SERVER['HTTP_CLIENT_IP'])) {
            // verifique se há IP ISP compartilhado
            $ipAddress = $_SERVER['HTTP_CLIENT_IP'];
        } else if (! empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            // verifique se há IPs passando por servidores proxy
            // verifique se vários endereços IP estão configurados e pegue o primeiro
            $ipAddressList = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
            foreach ($ipAddressList as $ip) {
                if ($this->isValidIpAddress($ip)) {
                    $ipAddress = $ip;
                    break;
                }
            }
        } else if (! empty($_SERVER['HTTP_X_FORWARDED']) && $this->isValidIpAddress($_SERVER['HTTP_X_FORWARDED'])) {
            $ipAddress = $_SERVER['HTTP_X_FORWARDED'];
        } else if (! empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']) && $this->isValidIpAddress($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) {
            $ipAddress = $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
        } else if (! empty($_SERVER['HTTP_FORWARDED_FOR']) && $this->isValidIpAddress($_SERVER['HTTP_FORWARDED_FOR'])) {
            $ipAddress = $_SERVER['HTTP_FORWARDED_FOR'];
        } else if (! empty($_SERVER['HTTP_FORWARDED']) && $this->isValidIpAddress($_SERVER['HTTP_FORWARDED'])) {
            $ipAddress = $_SERVER['HTTP_FORWARDED'];
        } else if (! empty($_SERVER['REMOTE_ADDR']) && $this->isValidIpAddress($_SERVER['REMOTE_ADDR'])) {
            $ipAddress = $_SERVER['REMOTE_ADDR'];
        }
        return $ipAddress;
    }

    /**
     * Para validar se um endereço IP é válido e não se enquadra
     * uma faixa de rede privada.
     *
     * @access public
     * @param string $ip
     */
    public function isValidIpAddress($ip)
    {
        if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) === false) {
            return false;
        }
        return true;
    }

}

Existem muitas opções fornecidas em todo este artigo para obter o endereço IP do usuário. Esta é a melhor entre todas as possibilidades apresentadas, mas recomendo fortemente que você continue a leitura.

Código mínimo para obter o endereço IP do usuário

O código abaixo de uma linha funcionará na maioria das situações. Leia a seção ‘confiabilidade do endereço IP’ abaixo. Isso lhe dará uma boa ideia.

$ipAddress = $_SERVER['REMOTE_ADDR']?:($_SERVER['HTTP_X_FORWARDED_FOR']?:$_SERVER['HTTP_CLIENT_IP']);

Obtenha o endereço IP do usuário para sites hospedados em CloudFlare

Tomei CloudFlare como exemplo. Existem muitos serviços semelhantes. Você precisa falar com esse provedor de serviços para saber qual cabeçalho de solicitação ele está definindo e obter o endereço IP de acordo.

Quando o site é hospedado usando o serviço CloudFlare, $_SERVER['REMOTE_ADDR']retornará o endereço IP do servidor CloudFlare e não o endereço IP do usuário. Portanto, em tal situação, você pode fazer uso da variável definida pelo servidor CloudFlare para obter o endereço IP.

if (isset($_SERVER["HTTP_CF_CONNECTING_IP"])) {
        $_SERVER['REMOTE_ADDR'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
        $ipAddress = $_SERVER['REMOTE_ADDR'];
}

Confiabilidade do endereço IP

$_SERVER['REMOTE_ADDR'] é a variável mais confiável da lista de variáveis ​​acima. REMOTE_ADDR pode não conter o endereço IP real da conexão TCP também. Depende da configuração SAPI.

Se o usuário estiver atrás de um servidor proxy, HTTP_X_FORWARDED_FOR será definido. Mas isso pode ser facilmente falsificado pelo usuário, definindo um endereço IP que ele deseja expor.

Mesmo a variável X-Forwarded-For ou o IP do cliente podem ser configurados pelo usuário para qualquer valor que desejar. Portanto, quando você mantém um log do endereço IP do usuário, é melhor armazenar o endereço IP que é retornado $_SERVER['REMOTE_ADDR'].

Veja o exemplo de um carrinho de compras . Você pode exibir o preço do produto de acordo com o país do usuário. Nesse cenário, você pode usar o endereço IP do usuário para determinar o país do usuário. Nesse cenário, o código para obter o endereço IP do usuário deve ser infalível.

Portanto, em resumo, se você está construindo um aplicativo de missão crítica que depende do endereço IP do usuário, este não é o caminho a percorrer. Para registro de auditoria do endereço IP do usuário, isso pode ser suficiente. Em essência, entenda cada linha desse código PHP e variáveis ​​usadas. Conheça bem o seu caso de uso e use-o de acordo.

Comprimento do campo de endereço IP

Quando você estiver armazenando o endereço IP no banco de dados, lembre-se de ter o tamanho do campo como 45 para um único IP. Porque existe a possibilidade de endereços IP IPv6. Em sua forma completa, o endereço IP IPv6 pode ter 45 caracteres de comprimento.

Como obter o endereço IP de um host

Usando um nome de host, podemos obter o endereço IP do servidor usando a função embutida do PHP gethostbyname. Isso retorna o endereço IPv4 do host fornecido no argumento.

$ipAddress = gethostbyname('www.comodesenvolver.com.br');

O inverso também é possível usando gethostbyaddr().

Endereço IP do usuário e questões de privacidade

O endereço IP do cliente pode ser considerado informação privada em certas legislações. Depende da lei da sua região. A Internet é pública em geral. Você nunca sabe de qual região geográfica obterá usuários.

De acordo com o GDPR (artigo 4.º, ponto 1; e considerando 49), o endereço IP é um dado pessoal. Sugiro informar o usuário e obter consentimento para registrar o endereço IP. Além disso, indique-o explicitamente em seu documento de “Política de Privacidade”.

Indique explicitamente que você está coletando e registrando o endereço IP do usuário e o motivo para fazer isso.

Conclusão

Compreenda bem o seu caso de uso. É importante compreender bem o cenário no qual você obterá e usará o endereço IP do usuário. Então entenda que o usuário final pode facilmente falsificar seu endereço IP e apresentar a você outra coisa. Terceiro, entenda cada linha do código, as variáveis ​​do servidor, de onde o endereço IP é obtido, quem o configura etc. Em seguida, decida como isso impactará seu caso de uso. Por último, mas não menos importante, indique explicitamente em sua política de privacidade que você está obtendo o endereço IP do usuário do cliente e armazenando-o. Também diga por que você está fazendo isso. De acordo com o GDPR, o endereço IP é uma informação pessoal do usuário e, portanto, seria melhor obter o consentimento do usuário antes de processá-la.