Pergunta

Eu quero armazenar os dados retornados pelo $_SERVER["REMOTE_ADDR"] em PHP em um campo DB, bem tarefa simples, na verdade. O problema é que não consigo encontrar qualquer informação adequada sobre o comprimento máximo da representação textuais de um endereço IPv6, que é o que um servidor web fornece através $_SERVER["REMOTE_ADDR"].

Eu não estou interessado em converter a representação textual para os 128 bits o endereço é normalmente codificados em, eu só quero saber quantos caracteres no máximo são necessários para armazenar qualquer endereço IPv6 retornado por $_SERVER["REMOTE_ADDR"].

Foi útil?

Solução

45 caracteres .

Você pode esperar uma morada para ser

0000:0000:0000:0000:0000:0000:0000:0000

8 * 4 + 7 = 39

8 grupos de 4 dígitos com 7 : entre eles.

Mas se você tem um IPv4-mapeados endereços IPv6 , o últimos dois grupos pode ser escrita em base de 10 separados por ., por exemplo. [::ffff:192.168.100.228]. Escrito por extenso:

0000:0000:0000:0000:0000:ffff:192.168.100.228

(6 * 4 + 5) + 1 + (4 * 3 + 3) = 29 + 1 + 15 = 45

nota, esta é uma convenção de entrada / exibição - é ainda um endereço de 128 bits e para o armazenamento, provavelmente seria melhor para padronizar o cólon cru separada formato, isto é, para o endereço [0000:0000:0000:0000:0000:ffff:c0a8:64e4] acima

.

Outras dicas

No Linux, consulte INET6_ADDRSTRLEN constante (incluem <arpa/inet.h>, consulte man inet_ntop). No meu sistema (header "in.h"):

#define INET6_ADDRSTRLEN 46

A última personagem é para terminar NULL, como eu acredito, portanto, o comprimento máximo é 45, como outras respostas.

respondi minha própria pergunta:

endereços IPv6 são normalmente escritos como oito grupos de quatro dígitos hexadecimais, onde cada grupo está separado por dois pontos (:).

Então, isso é 39 caracteres no máximo.

Eu acho resposta @Deepak nesta ligação é mais perto de resposta correta. comprimento Max para o endereço IP do cliente . Então tamanho correto é de 45 não 39. Às vezes tentamos scrounge em tamanho campos mas parece melhor se preparar tamanho de armazenamento suficiente.

Como indicado um endereço IPv6 padrão é no máximo de 45 caracteres, mas um endereço IPv6 também pode incluir um% terminando seguido por um "scope" ou cadeia "zona", que tem comprimento não fixo, mas é geralmente um pequeno número inteiro positivo ou um nome de interface de rede, de modo que, na realidade, pode ser maior do que 45 caracteres. nomes de interface de rede são tipicamente "eth0", "eth1", "wlan0", para escolher 50 como o limite é provável bom o suficiente.

Cuidado com determinados cabeçalhos como HTTP_X_FORWARDED_FOR que aparecem para conter um único endereço IP. Eles podem realmente conter vários endereços (uma cadeia de proxies eu suponho).

Eles parecem ser vírgula delimitado - e pode ser muito mais do que 45 caracteres no total -. modo a verificar antes de armazenar em DB

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top