Eu quero armazenar os dados retornados pelo $_SERVER["REMOTE_ADDR"]
PHP em um campo DB, tarefa bastante simples, realmente. O problema é que não consigo encontrar nenhuma informação adequada sobre o comprimento máximo da representação textual de um endereço IPv6, que é o que um servidor da web fornece $_SERVER["REMOTE_ADDR"]
.
Não estou interessado em converter a representação textual em 128 bits em que o endereço normalmente é codificado. Quero apenas saber quantos caracteres são necessários no máximo para armazenar qualquer endereço IPv6 retornado por $_SERVER["REMOTE_ADDR"]
.
ip
ip-address
ipv6
Gilles
fonte
fonte
Respostas:
45 caracteres .
Você pode esperar que um endereço seja
8 grupos de 4 dígitos com 7
:
entre eles.Mas se você tiver um endereço IPv6 mapeado para IPv4 , os dois últimos grupos poderão ser escritos na base 10 separados por
.
, por exemplo.[::ffff:192.168.100.228]
. Escrito totalmente:Observe que esta é uma convenção de entrada / exibição - ainda é um endereço de 128 bits e, para armazenamento, provavelmente seria melhor padronizar no formato separado por dois pontos,
[0000:0000:0000:0000:0000:ffff:c0a8:64e4]
por exemplo , para o endereço acima.fonte
No Linux, consulte constante
INET6_ADDRSTRLEN
(inclua<arpa/inet.h>
, consulteman inet_ntop
). No meu sistema (cabeçalho "in.h"):O último caractere é para terminar NULL, como eu acredito, então o comprimento máximo é 45, como outras respostas.
fonte
Respondeu minha própria pergunta:
Portanto, são 39 caracteres no máximo.
fonte
Acho que a resposta @Deepak neste link está mais próxima da resposta correta. Comprimento máximo para o endereço IP do cliente . Portanto, o tamanho correto é 45 e não 39. Às vezes, tentamos reduzir o tamanho dos campos, mas parece melhor se prepararmos um tamanho de armazenamento suficiente.
fonte
Conforme indicado, um endereço IPv6 padrão tem no máximo 45 caracteres, mas um endereço IPv6 também pode incluir um% final seguido por uma sequência de "escopo" ou "zona", que não possui comprimento fixo, mas geralmente é um pequeno número inteiro positivo ou uma interface de rede nome, portanto, na realidade, pode ter mais de 45 caracteres. Os nomes das interfaces de rede geralmente são "eth0", "eth1", "wlan0", portanto, escolher 50 como limite provavelmente é bom o suficiente.
fonte
Cuidado com determinados cabeçalhos, como os
HTTP_X_FORWARDED_FOR
que parecem conter um único endereço IP. Eles podem realmente conter vários endereços (uma cadeia de proxies que eu assumo).Eles parecerão delimitados por vírgula - e podem ter muito mais de 45 caracteres no total -, portanto, verifique antes de armazenar no DB.
fonte