2008-10-03 18 views
361

Quiero almacenar los datos devueltos por $_SERVER["REMOTE_ADDR"] en PHP en un campo DB, una tarea bastante simple, realmente. El problema es que no puedo encontrar ninguna información adecuada sobre la duración máxima de la representación textual de una dirección IPv6, que es lo que proporciona un servidor web a través $_SERVER["REMOTE_ADDR"].Longitud máxima de la representación textual de una dirección IPv6?

No estoy interesado en convertir la representación textual en los 128 bits en los que habitualmente está codificada la dirección, solo quiero saber cuántos caracteres son necesarios para almacenar cualquier dirección IPv6 devuelta por $_SERVER["REMOTE_ADDR"].

+6

¿Qué pasa con el índice de zona? –

+2

#define INET_ADDRSTRLEN (16) #define INET6_ADDRSTRLEN (48) – xxwatcherxx

+0

Fuente: lxr.free-electrons.com/source/include/linux/inet.h – xxwatcherxx

Respuesta

504

Una opción ligeramente incorrecto, ingenuo sería:

8 * 4 + 7 = 39

8 grupos de 4 dígitos con 7 ':' entre ellos.

Sin embargo, para tener en cuenta la función de direcciones IPv4 a IPv6, por ejemplo. [::ffff:192.168.0.1], escrita a cabo plenamente:

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

Nota, esta es una entrada/convención de pantalla: la cantidad de datos es la misma y para el almacenamiento probablemente sería mejor estandarizar en el formato separado de dos puntos crudos, es decir. [0000:0000:0000:0000:ffff:7fa8:0001] para la dirección anterior.

+14

0000: 0000: 0000: 0000: 0000: 0000: 127.127.127.127 Cuando leo aquí: http://tools.ietf.org/html/rfc4291, esto podría ser válido. Y esto es 45 caracteres. – Vili

+215

Los archivos de encabezado definen INET6_ADDRSTRLEN como 46, que se ajusta con 45 caracteres más un nulo final. – wisnij

+28

Así que para que sea seguro y agradable, 50 caracteres. – Sophivorus

15

respondió a mi propia pregunta:

direcciones IPv6 se escriben normalmente como ocho grupos de cuatro dígitos hexadecimales, donde cada grupo está separado por dos puntos (:).

Así que por 39 caracteres como máximo.

+3

Sin embargo, aparentemente hay una advertencia, vea http://stackoverflow.com/a/7477384/3787376 ("Longitud máxima para la dirección IP del cliente") - Cita: "Para direcciones IPv6 mapeadas IPv4, la cadena puede tener más de 39 caracteres. ". Dice que un "IPv6 mapeado IPv6" tiene 45 caracteres y tiene el formato "NNNN: NNNN: NNNN: NNNN: NNNN: NNNN: 192.168.158.190". El máximo debe ser, por lo tanto, de 45 caracteres. La respuesta en http://stackoverflow.com/a/166157/3787376 (esta pregunta) también parece demostrar este punto. – Edward

7

creo respuesta @Deepak en este enlace es más cercano al correcto respuesta. Max length for client ip address. Entonces, el tamaño correcto es 45, no 39. Algunas veces tratamos de buscar en el tamaño de los campos, pero parece que es mejor si preparamos suficiente espacio de almacenamiento.

64

En Linux, vea la constante INET6_ADDRSTRLEN (incluya <arpa/inet.h>, vea man inet_ntop). En mi sistema (encabezado "in.h"):

#define INET6_ADDRSTRLEN 46 

El último carácter es para la terminación NULL, ya que me creer, por lo que la longitud máxima es de 45 años, como otras respuestas.

0

Cuidado con ciertas cabeceras como HTTP_X_FORWARDED_FOR que parecen contener una única dirección IP. En realidad, pueden contener varias direcciones (supongo que una cadena de proxies).

Ellos parecen ser comma delimited - y pueden ser mucho más largo que 45 caracteres en total - a fin de comprobar antes de guardarlo en el PP.

+2

Un -1 ligeramente conflictivo (en conflicto porque he caído en esta trampa antes, y supongo que esta respuesta contiene información relevante para algunas personas que llegarán a esta página) porque, sin embargo, esto claramente no es una respuesta a la pregunta . Probablemente sería mejor como un comentario sobre la pregunta. –

1

Como indica una dirección IPv6 estándar es como máximo 45 caracteres, pero una dirección IPv6 también puede incluir un% final seguido de una cadena "ámbito" o "zona", que no tiene longitud fija pero generalmente es un pequeño número entero positivo o un nombre de interfaz de red, por lo que en realidad puede tener más de 45 caracteres.Los nombres de interfaz de red son típicamente "eth0", "eth1", "wlan0", por lo que elegir 50 como el límite es lo suficientemente bueno.

+0

Cierto, pero esto es solo direcciones locales de enlace, y no verá ninguna de ellas una vez que su sitio web se esté ejecutando en Internet (y con suerte ni siquiera cuando lo desarrolle). –

Cuestiones relacionadas