Je veux stocker les données renvoyées par $_SERVER["REMOTE_ADDR"]
dans 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 l'adresse représentation textuelle d'une adresse IPv6, qui correspond à ce qu'un serveur Web fournit via $_SERVER["REMOTE_ADDR"]
.
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 $_SERVER["REMOTE_ADDR"]
.
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 avec 7 :
entre eux.
Mais si vous avez un adresse IPv6 mappée IPv4 , 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
Notez que ceci est une convention d’entrée/d’affichage - c’est toujours une adresse 128 bits et pour le stockage, il serait probablement préférable de normaliser le format brut, séparé par des deux-points, c’est-à-dire [0000:0000:0000:0000:0000:ffff:c0a8:64e4]
pour l’adresse ci-dessus.
Sous Linux, voir la constante INET6_ADDRSTRLEN
(inclure <arpa/inet.h>
, voir man inet_ntop
). Sur mon système (en-tête "in.h"):
#define INET6_ADDRSTRLEN 46
Le dernier caractère est pour terminer NULL, comme je le crois, la longueur maximale est donc 45, comme pour les autres réponses.
Répondit à 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 (:).
Donc, c'est 39 caractères maximum.
Je pense que @Deepak répond dans ce lien est plus proche de la réponse correcte. Longueur maximale pour l'adresse IP du client . La taille correcte est donc 45 et non 39. Parfois, nous essayons 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 est au maximum de 45 caractères, mais une adresse ipv6 peut également inclure un% de fin suivi par une chaîne "scope" ou "zone", qui n'a pas de longueur fixe mais est généralement un petit entier positif ou une interface réseau nom, donc en réalité il peut être plus grand que 45 caractères. Les noms d'interface réseau sont généralement "eth0", "eth1", "wlan0", donc choisir 50 comme limite est probablement suffisant.
Méfiez-vous des 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 séparés par des virgules - et peuvent contenir beaucoup plus de 45 caractères - vérifiez donc avant de les stocker dans la base de données.