Pregunta

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

No estoy interesado en convertir la representación textual en los 128 bits en los que generalmente se codifica la dirección, solo quiero saber cuántos caracteres como máximo se necesitan para almacenar cualquier dirección IPv6 devuelta por <=>.

¿Fue útil?

Solución

45 caracteres .

Puede esperar que una dirección sea

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

8 * 4 + 7 = 39

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

Pero si tiene una dirección IPv6 asignada por IPv4 , la los dos últimos grupos se pueden escribir en base 10 separados por ., por ejemplo. [::ffff:192.168.100.228]. Escrito completamente:

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

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

Tenga en cuenta que esta es una convención de entrada / visualización: sigue siendo una dirección de 128 bits y para el almacenamiento probablemente sea mejor estandarizar en el formato separado por dos puntos sin procesar, es decir, [0000:0000:0000:0000:0000:ffff:c0a8:64e4] para la dirección anterior.

Otros consejos

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

#define INET6_ADDRSTRLEN 46

El último carácter es para terminar NULL, como creo, por lo que la longitud máxima es 45, como otras respuestas.

Respondí mi propia pregunta:

  

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

Entonces, eso es un máximo de 39 caracteres.

Creo que la respuesta @Deepak en este enlace está más cerca de la respuesta correcta. Longitud máxima para la dirección IP del cliente . Por lo tanto, el tamaño correcto es 45, no 39. A veces intentamos buscar en el tamaño de los campos, pero parece mejor si preparamos suficiente tamaño de almacenamiento.

Como se indicó, una dirección ipv6 estándar tiene como máximo 45 caracteres, pero una dirección ipv6 también puede incluir un% final seguido de un " scope " o " zona " cadena, que no tiene una longitud fija, pero generalmente es un entero positivo pequeño o un nombre de interfaz de red, por lo que en realidad puede tener más de 45 caracteres. Los nombres de las interfaces de red suelen ser & Quot; eth0 & Quot ;, & Quot; eth1 & Quot ;, & Quot; wlan0 & Quot ;, por lo que elegir 50 como límite probablemente sea bueno suficiente.

Tenga cuidado con ciertos encabezados como HTTP_X_FORWARDED_FOR que parecen contener una sola dirección IP. En realidad, pueden contener varias direcciones (supongo que una cadena de servidores proxy).

Parecen ser delimitado por comas , y puede ser mucho más largo que 45 caracteres en total, así que verifique antes de almacenar en DB.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top