Question

Je veux stocker les données renvoyées par $_SERVER["REMOTE_ADDR"] en PHP dans un champ de base de données, tâche assez simple, vraiment. Le problème est que je ne trouve aucune information appropriée sur la longueur maximale de la représentation textuelle d'une adresse IPv6, qui est fournie par un serveur Web via <=>.

Je ne suis pas intéressé par la conversion de la représentation textuelle en 128 bits dans lesquels l'adresse est généralement codée. Je veux simplement savoir combien de caractères au maximum sont nécessaires pour stocker une adresse IPv6 renvoyée par <=>.

Était-ce utile?

La solution

45 caractères .

Vous pourriez vous attendre à ce qu'une adresse soit

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

8 * 4 + 7 = 39

8 groupes de 4 chiffres séparés par 7 :.

Mais si vous avez une adresse IPv6 mappée par IPv4 , le Les deux derniers groupes peuvent être écrits en base 10 séparés par ., par exemple. [::ffff:192.168.100.228] Complètement écrit:

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

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

Remarque: il s'agit d'une convention d'entrée / d'affichage. Il s'agit toujours d'une adresse 128 bits. Pour le stockage, il serait probablement préférable de normaliser le format brut séparé par un signe deux-points, c'est-à-dire [0000:0000:0000:0000:0000:ffff:c0a8:64e4] pour l'adresse ci-dessus.

Autres conseils

Sous Linux, voir la constante INET6_ADDRSTRLEN (inclure <arpa/inet.h>, voir man inet_ntop). Sur mon système (en-tête & Quot; in.h & Quot;)):

#define INET6_ADDRSTRLEN 46

Le dernier caractère sert à terminer NULL, comme je le crois, la longueur maximale est donc 45, comme les autres réponses.

a répondu à ma propre question:

  

Les adresses IPv6 sont normalement écrites en huit groupes de quatre chiffres hexadécimaux, chaque groupe étant séparé par un signe deux-points (:).

Cela fait donc 39 caractères maximum

Je pense que la réponse de @Deepak dans ce lien est plus proche de la réponse correcte. Longueur maximale de l'adresse IP du client . La taille correcte est donc 45 et non 39. Nous essayons parfois de saisir la taille des champs, mais cela semble préférable si nous préparons une taille de stockage suffisante.

Comme indiqué, une adresse ipv6 standard contient au maximum 45 caractères, mais une adresse ipv6 peut également inclure un% de fin suivi d'un & "scope &"; ou " zone " string, qui n'a pas de longueur fixe, mais est généralement un petit entier positif ou un nom d'interface réseau. En réalité, il peut contenir plus de 45 caractères. Les noms d'interface réseau sont généralement & "; Eth0 &"; & "; Eth1 &"; & "; Wlan0 &" ;, donc choisir 50 comme limite est probablement bon assez.

Méfiez-vous de certains en-têtes tels que HTTP_X_FORWARDED_FOR qui semblent contenir une seule adresse IP. Ils peuvent en fait contenir plusieurs adresses (une chaîne de mandataires, je suppose).

Ils apparaîtront comme délimité par des virgules - et peut contenir beaucoup plus de 45 caractères - vérifiez donc avant de stocker dans la base de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top