Domanda

Voglio archiviare i dati restituiti da $_SERVER["REMOTE_ADDR"] in PHP in un campo DB, un compito abbastanza semplice, davvero. Il problema è che non riesco a trovare alcuna informazione adeguata sulla lunghezza massima della rappresentazione testuale di un indirizzo IPv6, che è ciò che un server web fornisce attraverso <=>.

Non sono interessato a convertire la rappresentazione testuale nei 128 bit in cui l'indirizzo è solitamente codificato, voglio solo sapere quanti caratteri al massimo sono necessari per memorizzare qualsiasi indirizzo IPv6 restituito da <=>.

È stato utile?

Soluzione

45 caratteri .

Potresti aspettarti che un indirizzo sia

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

8 * 4 + 7 = 39

8 gruppi di 4 cifre con 7 : tra loro.

Ma se hai un Indirizzo IPv6 mappato IPv4 , il gli ultimi due gruppi possono essere scritti nella base 10 separati da ., ad es. [::ffff:192.168.100.228]. Scritto per intero:

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

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

Nota, questa è una convenzione di input / display - è ancora un indirizzo a 128 bit e per l'archiviazione sarebbe probabilmente meglio standardizzare il formato separato da due punti, ovvero [0000:0000:0000:0000:0000:ffff:c0a8:64e4] per l'indirizzo sopra.

Altri suggerimenti

Su Linux, vedi costante INET6_ADDRSTRLEN (includi <arpa/inet.h>, vedi man inet_ntop). Sul mio sistema (header & Quot; in.h & Quot;):

#define INET6_ADDRSTRLEN 46

L'ultimo carattere è per terminare NULL, come credo, quindi la lunghezza massima è 45, come altre risposte.

Ha risposto alla mia domanda:

  

Gli indirizzi IPv6 sono normalmente scritti come otto gruppi di quattro cifre esadecimali, in cui ogni gruppo è separato da due punti (:).

Quindi sono al massimo 39 caratteri

Penso che la risposta @Deepak in questo link sia più vicina alla risposta corretta. Lunghezza massima per l'indirizzo IP del client . Quindi la dimensione corretta è 45 non 39. A volte proviamo a scavare nelle dimensioni dei campi ma sembra meglio se prepariamo abbastanza dimensioni di archiviazione.

Come indicato, un indirizzo ipv6 standard è al massimo di 45 caratteri, ma un indirizzo ipv6 può anche includere una% finale seguita da un " scope " oppure " zona " stringa, che non ha una lunghezza fissa ma è generalmente un piccolo numero intero positivo o un nome di interfaccia di rete, quindi in realtà può contenere più di 45 caratteri. I nomi delle interfacce di rete sono in genere & Quot; eth0 & Quot ;, & Quot; eth1 & Quot ;, & Quot; wlan0 & Quot ;, quindi scegliere 50 come limite è probabilmente buono sufficiente.

Fai attenzione a determinate intestazioni come HTTP_X_FORWARDED_FOR che sembrano contenere un singolo indirizzo IP. Possono effettivamente contenere più indirizzi (una catena di proxy presumo).

Sembrano essere delimitato da virgole - e può essere molto più lungo di 45 caratteri in totale - quindi controlla prima di archiviarlo nel DB.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top