Максимальная длина текстового представления IPv6-адреса?

Я хочу сохранить данные, возвращаемые $_SERVER["REMOTE_ADDR"] в PHP, в поле БД, на самом деле довольно простая задача. Проблема в том, что я не могу найти никакой надлежащей информации о максимальной длине текстового представления адреса IPv6, которое веб-сервер предоставляет через $_SERVER["REMOTE_ADDR"].

Меня не интересует преобразование текстового представления в 128 бит, в которых обычно кодируется адрес, я просто хочу знать, сколько символов требуется для хранения любого адреса IPv6, возвращаемого $_SERVER["REMOTE_ADDR"].


person Gilles    schedule 03.10.2008    source источник
comment
А что с индексом зоны?   -  person Robert Tupelo-Schneck    schedule 25.10.2012
comment
#define INET_ADDRSTRLEN (16) #define INET6_ADDRSTRLEN (48)   -  person    schedule 08.06.2015
comment
Источник: lxr.free-electrons.com/source/include/linux/inet.h   -  person    schedule 08.06.2015
comment
Вопрос stackoverflow.com/questions/1076714/ есть несколько похожих, но полезных ответов.   -  person Edward    schedule 17.04.2016


Ответы (6)


45 символов.

Вы можете ожидать, что адрес будет

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

8 * 4 + 7 = 39

8 групп по 4 цифры с 7 : между ними.

Но если у вас есть IPv6-адрес с сопоставлением IPv4, последние две группы может быть записано с основанием 10 через ., например. [::ffff:192.168.100.228]. Записано полностью:

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

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

Обратите внимание, что это соглашение о вводе / отображении - это все еще 128-битный адрес, и для хранения, вероятно, лучше всего будет стандартизировать исходный формат, разделенный двоеточиями, то есть [0000:0000:0000:0000:0000:ffff:c0a8:64e4] для адреса, указанного выше.

person Matthew Scharley    schedule 03.10.2008
comment
Заголовочные файлы определяют INET6_ADDRSTRLEN равным 46, что соответствует 45 символам плюс конечный ноль. - person wisnij; 22.01.2010
comment
Стоит отметить, что IPv6-адрес может также содержать область видимости stackoverflow .com / questions / 5746082 /, например. вы получаете это из RemoteEndpointMessageProperty.Address - person Rory; 18.06.2012
comment
разве адреса ipv4 не записываются как :: ffff: 127.0.0.1? - person graywolf; 10.09.2012
comment
@Paladin: Думаю, это сокращенная версия, да. Они по-прежнему расширяются до полных адресов с нулями, как указано выше, что означает, что вам также нужно учитывать это. - person Matthew Scharley; 11.09.2012
comment
@MatthewScharley ну ... вам не нужно это учитывать ... вы можете просто поместить его в базу данных вот так ... так что вы можете использовать 39 символов вместо 45 символов. - person graywolf; 11.09.2012
comment
Недавно я видел несколько IP4-адресов с двойными точками, например 183.60..244.37 от некоторых злонамеренных зондов. Поэтому я думаю, что 50 будет лучше, чем 45, чтобы иметь возможность отслеживать плохие IP-адреса. - person Elliptical view; 09.02.2014
comment
учитывает ли это знак процента в адресе ipv6? Обратитесь - superuser.com/questions/99746/ - person Gaurav; 13.12.2018
comment
@Ellipticalview Независимо от того, насколько большим вы сделаете буфер, злонамеренный субъект всегда может выдать более длинную искаженную строку. Имеет смысл сделать буфер достаточно большим, чтобы хранить самое длинное допустимое значение и другими способами обрабатывать неверный ввод. - person kasperd; 06.02.2019
comment
@kasperd, Хорошее замечание. Думаю, я рассматривал особый случай использования: размер, необходимый для блокировки вредоносных IP-адресов, и вы правы, этот размер может увеличиться. Мне нужен был способ записать и заблокировать список плохих актеров. - person Elliptical view; 06.02.2019
comment
@Ellipticalview Если вы регистрируете IP-адреса клиентов, вы должны использовать доверенный код на своем собственном конце для преобразования из проводного формата в текстовое представление. В этом случае злоумышленник не может вызвать неправильный IP-адрес в вашем журнале. По-прежнему разумно проверять ввод для защиты от слишком длинных строк, но на этом этапе вы защищаете от своих собственных ошибок, а не от злоумышленника. - person kasperd; 10.02.2019

В Linux см. Константу INET6_ADDRSTRLEN (включая <arpa/inet.h>, см. man inet_ntop). В моей системе (заголовок "in.h"):

#define INET6_ADDRSTRLEN 46

Последний символ предназначен для завершения NULL, как я полагаю, поэтому максимальная длина составляет 45, как и другие ответы.

person Yury    schedule 09.12.2013
comment
Так что же это за 48 я вижу? github.com/torvalds/linux/blob/master/ include / linux / inet.h # L50 - person eis; 20.09.2019
comment
@eis, вероятно, был в 2013 году. Возможно, увеличен для выравнивания структуры. - person Iiridayn; 07.04.2020

Ответил на свой вопрос:

Адреса IPv6 обычно записываются в виде восьми групп из четырех шестнадцатеричных цифр, где каждая группа разделяется двоеточием (:).

Так что это не более 39 символов.

person Gilles    schedule 03.10.2008
comment
Однако, по-видимому, есть предостережение, см. stackoverflow.com/a/7477384/3787376 (максимальная длина для IP-адреса клиента) - Цитата : Для адресов IPv6 с отображением IPv4 строка может быть длиннее 39 символов. В нем говорится, что сопоставленный IPv4 IPv6 состоит из 45 символов и имеет формат NNNN: NNNN: NNNN: NNNN: NNNN: NNNN: 192.168.158.190. Таким образом, максимум должен состоять из 45 символов. Ответ на stackoverflow.com/a/166157/3787376 (этот вопрос), похоже, также демонстрирует эту точку зрения. - person Edward; 17.04.2016

Как указано, стандартный IPv6-адрес состоит не более чем из 45 символов, но IPv6-адрес может также включать конечный%, за которым следует строка «scope» или «zone», которая не имеет фиксированной длины, но обычно представляет собой небольшое положительное целое число или сетевой интерфейс. имя, поэтому на самом деле оно может быть больше 45 символов. Имена сетевых интерфейсов обычно - "eth0", "eth1", "wlan0", поэтому выбор 50 в качестве ограничения, вероятно, будет достаточно хорошим.

person Sean F    schedule 05.03.2017
comment
Верно, но это только локальные для ссылок адреса, и вы не увидите ни одного из них, когда ваш веб-сайт будет работать в Интернете (и, надеюсь, даже во время его разработки). - person Michael Hampton; 05.03.2017

Я думаю, что ответ @Deepak в этой ссылке более близок к правильному ответу. Максимальная длина IP-адреса клиента. Итак, правильный размер - 45, а не 39. Иногда мы пытаемся подобрать размер полей, но кажется, что лучше подготовить достаточный размер хранилища.

person QMaster    schedule 08.12.2013

Обратите внимание на определенные заголовки, такие как HTTP_X_FORWARDED_FOR, которые могут содержать один IP-адрес. На самом деле они могут содержать несколько адресов (я предполагаю, цепочка прокси).

Они будут выглядеть как разделены запятыми - и могут быть намного длиннее 45 символов, поэтому проверьте перед сохранением в БД.

person Simon_Weaver    schedule 17.02.2017
comment
Слегка противоречивый -1 (противоречивый, потому что я попадал в эту ловушку раньше, и я предполагаю, что этот ответ содержит информацию, относящуюся к некоторым людям, которые будут заходить на эту страницу), потому что, тем не менее, это явно не ответ на заданный вопрос. Наверное, было бы лучше в качестве комментария к вопросу. - person Mark Amery; 12.04.2017