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

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

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

 user168761908 июн. 2015 г., 20:34
Источник: lxr.free-electrons.com/source/include/linux/inet.h
 Robert Tupelo-Schneck25 окт. 2012 г., 20:02
А как насчет индекса зоны?
 user168761908 июн. 2015 г., 20:32
#define INET_ADDRSTRLEN (16) #define INET6_ADDRSTRLEN (48)
 Edward17 апр. 2016 г., 14:31
Вопросstackoverflow.com/questions/1076714/... имеет несколько похожих, но полезных ответов.

Ответы на вопрос(6)

В Linux смотрите константуINET6_ADDRSTRLEN (включают, увидетьman inet_ntop). На моей системе (заголовок "in.h»):

#define INET6_ADDRSTRLEN 46

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

Решение Вопроса

45 символов.

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

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

8 * 4 + 7 = 39

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

Но если у вас естьIPv4-сопоставленный IPv6-адреспоследние две группы можно записать в базу 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] для адреса выше.

 Elliptical view09 февр. 2014 г., 04:16
Недавно я видел некоторые IP4-адреса с двойными точками, например 183.60..244.37 от некоторых злонамеренных зондов. Поэтому я считаю, что 50 было бы лучше, чем 45, чтобы отслеживать плохие IP-адреса.
 gbjbaanb27 нояб. 2012 г., 12:51
@FelipeSchenone это такое мышление, которое бесполезно - выяснить размер и использовать его. Единственный раз, когда вы хотите расширить буфер, это если он помогает с заполнением, так что 64 символа, но 45 (+1) является оптимальным.
 kasperd10 февр. 2019 г., 14:30
@Ellipticalview Если вы регистрируете IP-адреса клиентов, вы должны использовать доверенный код на своем собственном конце для преобразования из проводного формата в текстовое представление. В этом случае это неЗлоумышленник может вызвать появление неверного IP-адреса в вашем журнале. Это'По-прежнему целесообразно проверять ввод для защиты от слишком длинных строк, но в этот момент вы защищаетесь от своих ошибок, а не от злоумышленника.
 gaurav13 дек. 2018 г., 11:18
это учитывает процент входа в IPv6-адрес? Обратитесь -superuser.com/questions/99746/...
 wisnij22 янв. 2010 г., 17:33
В заголовочных файлах для INET6_ADDRSTRLEN задано значение 46, что соответствует 45 символам плюс завершающий ноль.
 Elliptical view06 февр. 2019 г., 19:13
@kasperd, Хороший вопрос. Я думаю, что я искал особый вариант использования: размер, необходимый для блокировки вредоносных IP-адресов, и выверно, что размер может расти больше. Мне нужен был способ записать и заблокировать список плохих актеров.
 Matthew Scharley11 сент. 2012 г., 01:03
@Paladin: ЭтоЭто сокращенная версия, я верю, да. Они по-прежнему расширяются до полных адресов с нулями, как указано выше, что означает, что вы должны иметь возможность учитывать это также.
 graywolf11 сент. 2012 г., 10:26
@ MatthewScharley хорошо ... ты неэто нужно учитывать ... вы можете просто поместить его в db вот так ... так что вы можете использовать 39 символов вместо 45 символов.
 graywolf10 сент. 2012 г., 16:17
Арен»t ipv4 адреса, написанные как :: ffff: 127.0.0.1?
 Rory18 июн. 2012 г., 12:26
Стоит отметить, что адрес IPv6 может также содержать зону действияstackoverflow.com/questions/5746082/...например, вы получаете это из RemoteEndpointMessageProperty.Address
 kasperd06 февр. 2019 г., 10:29
@Ellipticalview. Независимо от размера буфера злоумышленник всегда может найти более длинную искаженную строку. Имеет больше смысла сделать буфер достаточно большим, чтобы хранить самое длинное допустимое значение и справляться с некорректным вводом другими способами.

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

Чтобы'с 39 символов макс.

 Edward17 апр. 2016 г., 14:26
Однако естьВидимо предостережение, видитеstackoverflow.com/a/7477384/3787376 ("Максимальная длина для IP-адреса клиента ") - Цитата: "Для сопоставленных IPv4-адресов IPv6 строка может быть длиннее 39 символов. ", Это говорит о том, чтоIPv4-сопоставленный IPv6 " 45 символов и находится в формате "NNNN: NNNN: NNNN: NNNN: NNNN: NNNN: 192.168.158.190", Следовательно, максимум должен быть 45 символов. Ответ наstackoverflow.com/a/166157/3787376 (этот вопрос) также, кажется, демонстрирует эту точку зрения.

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

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

 Mark Amery11 апр. 2017 г., 23:16
Немного противоречивый -1 (конфликтовал, потому что ямы уже попали в эту ловушку, и я думаю, что этот ответ содержит информацию, относящуюся к некоторым людям, которые будут появляться на этой странице), потому что, тем не менее, это явно нет ответ на заданный вопрос. Вероятно, было бы лучше в качестве комментария на вопрос.

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

 Michael Hampton05 мар. 2017 г., 20:36
Правда, но это только локальные адреса, и вы нене увидите ни одного из них, когда ваш сайт будет запущен в Интернете (и, надеюсь, даже при его разработке).

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

Ваш ответ на вопрос