2008-10-03 14 views
361

Chcę przechowywać dane zwrócone przez $_SERVER["REMOTE_ADDR"] w PHP w polu DB, całkiem proste zadanie, naprawdę. Problem polega na tym, że nie mogę znaleźć odpowiednich informacji na temat maksymalnej długości reprezentacji tekstowej adresu IPv6, co zapewnia serwer internetowy poprzez $_SERVER["REMOTE_ADDR"].Maksymalna długość tekstowej reprezentacji adresu IPv6?

Nie jestem zainteresowany konwersją tekstowej reprezentacji na 128 bitów, w których adres jest zwykle kodowany, chcę tylko wiedzieć, ile znaków jest wymaganych do przechowywania dowolnego adresu IPv6 zwróconego przez $_SERVER["REMOTE_ADDR"].

+6

Co z indeksem strefy? –

+2

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

+0

Źródło: lxr.free-electrons.com/source/include/linux/inet.h – xxwatcherxx

Odpowiedz

504

Nieco nieprawidłowe opcja naiwne to:

8 * 4 + 7 = 39

8 grup po 4 cyfr i 7 '' między nimi.

Ale aby uwzględnić funkcję adresów IPv6 odwzorowanych w IPv4, np. [::ffff:192.168.0.1], zapisana w pełni:

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

notatki, to jest wejść/konwencja wyświetlania - ilość danych jest taka sama, a dla przechowywania najlepiej byłoby standaryzować na surowym formacie rozdzielonym dwukropkami, tj. [0000:0000:0000:0000:ffff:7fa8:0001] dla powyższego adresu.

+14

0000: 0000: 0000: 0000: 0000: 0000: 127.127.127.127 Jak czytałem tutaj: http://tools.ietf.org/html/rfc4291, może to być poprawne. A to jest 45 znaków. – Vili

+215

Pliki nagłówka definiują INET6_ADDRSTRLEN na 46, co pasuje do 45 znaków plus końcowa wartość pusta. – wisnij

+28

Tak, aby było bezpieczne i przyjemne, 50 znaków. – Sophivorus

15

odpowiedział na moje własne pytanie:

Adresy IPv6 są zazwyczaj pisane jako osiem grup po cztery cyfry szesnastkowe, gdzie każda grupa jest oddzielone dwukropkiem (:).

To maksymalnie 39 znaków.

+3

Jednak najwyraźniej istnieje zastrzeżenie, patrz http://stackoverflow.com/a/7477384/3787376 ("Maksymalna długość adresu IP klienta") - Cytat: "W przypadku adresów IPv6 odwzorowanych w protokole IPv4 łańcuch może mieć więcej niż 39 znaków. ". Mówi, że "IPv6 odwzorowany w IPv4" ma 45 znaków i jest w formacie "NNNN: NNNN: NNNN: NNNN: NNNN: NNNN: 192.168.158.190". Maksymalna wartość powinna zatem wynosić 45 znaków. Odpowiedź na http://stackoverflow.com/a/166157/3787376 (to pytanie) również zdaje się potwierdzać ten punkt. – Edward

7

Myślę, że odpowiedź @Deepak w tym linku jest bardziej zbliżona do poprawnej odpowiedzi. Max length for client ip address. Więc poprawny rozmiar to 45, a nie 39. Czasami próbujemy wyćwiczyć rozmiar pól, ale wydaje się, że lepiej, jeśli przygotujemy wystarczająco dużo miejsca na dysku.

64

W systemie Linux patrz stała INET6_ADDRSTRLEN (w tym <arpa/inet.h>, patrz man inet_ntop). W moim systemie (nagłówek „in.h”):

#define INET6_ADDRSTRLEN 46 

Ostatni znak jest do zakończenia null, jak wierzę, więc maksymalna długość wynosi 45, a inne odpowiedzi.

0

Uważaj na określone nagłówki, takie jak HTTP_X_FORWARDED_FOR, które wydają się zawierać pojedynczy adres IP. Mogą faktycznie zawierać wiele adresów (łańcuch proxy, który zakładam).

Pojawią się one jako comma delimited - i mogą być dłuższe niż 45 znaków łącznie - więc sprawdź przed zapisaniem w DB.

+2

Lekko w konflikcie -1 (konflikt, ponieważ wpadłem w tę pułapkę wcześniej i myślę, że ta odpowiedź zawiera informacje istotne dla niektórych osób, które będą przybywać na tę stronę), ale to oczywiście nie jest odpowiedzią na zadane pytanie . Byłoby lepiej jako komentarz do pytania. –

1

Jak wskazano, standardowy adres IPv6 ma najwyżej 45 znaków, ale adres IPv6 może również zawierać końcówkę%, po której występuje ciąg "strefa" lub "strefa", który nie ma ustalonej długości, ale generalnie jest małą dodatnią liczbą całkowitą lub nazwa interfejsu sieciowego, więc w rzeczywistości może mieć więcej niż 45 znaków.Nazwy interfejsów sieciowych to zazwyczaj "eth0", "eth1", "wlan0", więc wybór 50 jako limitu jest prawdopodobnie wystarczająco dobry.

+0

To prawda, ale to są tylko adresy lokalne dla łącza i nie zobaczycie żadnego z nich, gdy witryna będzie już działała w Internecie (i mam nadzieję, że nawet podczas jej tworzenia). –

Powiązane problemy