Валидация адресов в работе с IP-адресами
Любое приложение, которое хоть как‑то работает с сетью, должно валидировать правильность IP-адресов. Это сложнее, чем может показаться. Здесь легко впасть в крайности: при излишне строгой валидации пользователь не сможет ввести верные данные, при недостаточной — окажется наедине с низкоуровневыми сообщениями об ошибках (если они вообще передаются).
В этой статье мы разберем ряд сложностей, возникающих при валидации адресов, а потом посмотрим на готовые библиотеки, которые с этим помогают.
Валидация адресов
Ошибки в адресах могут появиться тремя способами:
От попыток сломать приложение одна валидация адресов не поможет. Она может затруднить такие попытки, но не заменит полноценную проверку авторизации и обработку ошибок на всех этапах работы программы, так что улучшение безопасности нужно рассматривать скорее как полезный побочный эффект. Основная цель — упростить жизнь пользователям, которые случайно ввели неверный адрес или неправильно поняли, что от них требуется.
Проверки можно условно разделить на проверки по форме и по существу. Цель формальной проверки — убедиться, что введенная пользователем строка вообще может быть допустимым адресом. Многие программы ограничиваются именно этим. Мы же пойдем дальше и посмотрим, как можно проверять, что адрес не только правильный, но и подходящий для конкретной цели, но об этом позже.
Проверки по форме
Проверка правильности формата только на вид может показаться задачей для несложного регулярного выражения — на деле все не так просто.
В IPv4 сложности начинаются со стандарта на этот формат — такого стандарта не существует. Формат dot-decimal ( 0. 0. 0. 0–255. 255. 255. 255 ) — общепринятый, но не стандартный. Стандарт IPv4 не содержит никаких упоминаний о формате записи адресов вообще. Никакой другой RFC тоже ничего не говорит о формате адресов IPv4, так что общепринятый формат — это не более чем соглашение.
Если ограничиться поддержкой только полного dot-decimal из четырех групп, без возможности опускать нулевые разряды, то выражение (\ d+)\.(\ d+)\.(\ d+)\.(\ d+) может поймать значительную часть опечаток. Если задаться целью, можно составить выражение для любого допустимого адреса, хотя оно и будет довольно громоздким. Лучше воспользоваться тем, что его легко разделить на группы, и явно проверить, что каждая из них попадает в диапазон 0–255:
Так что, если приложение поддерживает IPv6, для валидации адресов нужен полноценный парсер. Писать его самим нет смысла, поскольку существуют готовые библиотеки, которые предоставляют и другие полезные функции.
Проверки по существу
Если уж мы взялись подключать библиотеку и парсить адреса, давай посмотрим, какие дополнительные проверки мы можем провести, чтобы отсеять ошибочные значения и сделать сообщения об ошибках более информативными.
Нужно также учитывать, что «зарезервированные для использования в будущем» сети могут перестать быть зарезервированными. Сети из RFC 5735 зарезервированы навсегда и в этом смысле безопасны. А вот авторы некогда популярной среди геймеров виртуальной сети Hamachi когда‑то считали, что сеть 5. 0. 0. 0/ 8 можно использовать для своих нужд, потому что она была зарезервирована для будущего использования, — пока будущее не наступило и IANA не выделила эту сеть RIPE.
Библиотеки
netaddr
IP без ошибок. Изучаем принципы работы с IP-адресами
Содержание статьи
Валидация адресов
Ошибки в адресах могут появиться тремя способами:
От попыток сломать приложение одна валидация адресов не поможет. Она может затруднить такие попытки, но не заменит полноценную проверку авторизации и обработку ошибок на всех этапах работы программы, так что улучшение безопасности нужно рассматривать скорее как полезный побочный эффект. Основная цель — упростить жизнь пользователям, которые случайно ввели неверный адрес или неправильно поняли, что от них требуется.
Проверки можно условно разделить на проверки по форме и по существу. Цель формальной проверки — убедиться, что введенная пользователем строка вообще может быть допустимым адресом. Многие программы ограничиваются именно этим. Мы же пойдем дальше и посмотрим, как можно проверять, что адрес не только правильный, но и подходящий для конкретной цели, но об этом позже.
Проверки по форме
Проверка правильности формата только на вид может показаться задачей для несложного регулярного выражения — на деле все не так просто.
В IPv4 сложности начинаются со стандарта на этот формат — такого стандарта не существует. Формат dot-decimal ( 0. 0. 0. 0–255. 255. 255. 255 ) — общепринятый, но не стандартный. Стандарт IPv4 не содержит никаких упоминаний о формате записи адресов вообще. Никакой другой RFC тоже ничего не говорит о формате адресов IPv4, так что общепринятый формат — это не более чем соглашение.
Если ограничиться поддержкой только полного dot-decimal из четырех групп, без возможности опускать нулевые разряды, то выражение (\ d+)\.(\ d+)\.(\ d+)\.(\ d+) может поймать значительную часть опечаток. Если задаться целью, можно составить выражение для любого допустимого адреса, хотя оно и будет довольно громоздким. Лучше воспользоваться тем, что его легко разделить на группы, и явно проверить, что каждая из них попадает в диапазон 0–255:
Так что, если приложение поддерживает IPv6, для валидации адресов нужен полноценный парсер. Писать его самим нет смысла, поскольку существуют готовые библиотеки, которые предоставляют и другие полезные функции.
Проверки по существу
Если уж мы взялись подключать библиотеку и парсить адреса, давай посмотрим, какие дополнительные проверки мы можем провести, чтобы отсеять ошибочные значения и сделать сообщения об ошибках более информативными.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
IP адрес
IP-адрес (Internet Protocol Address, айпи адрес) – это уникальный числовой идентификатор конкретного устройства в составе компьютерной сети, построенной на основе протокола TCP/IP. В этом и есть его основная функция. Для работы в Интернете требуется его глобальная уникальность. Для частной сети достаточно, чтобы были исключены совпадения в локальном пространстве.
Формат IP-адреса и как он выглядит
Правильный IP-адрес в сети Интернет может быть представлен в одном из двух цифровых форматов, который зависит от типа используемого протокола. В зависимости от того, к какому из этих типов принадлежит IP-адрес, будет понятно, сколько бит в нем.
Структура IP-адреса
Разберем, что обозначают цифры. В общем случае IP-адрес состоит из двух частей (ID-номеров): сети и конкретного узла в ее пределах. Чтобы отличать их в полной записи, используют классы или маски.
Для доступа к Интернет необходимо, чтобы IP принадлежал к другому блоку или в пределах локальной сети существовал сервер, на котором происходит подмена внутреннего адреса на внешний. С этой целью используются прокси или NAT. Для доступа к Интернету адрес выдается провайдером или региональным интернет-регистратором.
По умолчанию маршрутизатор может входить в несколько разных сетей. Каждый его порт имеет персональный IP-адрес. Соответственно, такой же принцип работы применим к конкретным компьютерам, которые могут поддерживать различное число сетевых связей.
Типы IP-адресов
В зависимости от способа использования
Внешний. Он же «белый», публичный или глобальный. Используется во время доступа в Интернет. Такой IP-адрес является уникальным и именно под ним устройство видят в сети. Так как количество таких идентификаторов ограничено, задействуют технологию NAT. Она позволяет транслировать сетевые IP-адреса из частных в публичные. Для этого применяются маршрутизаторы определенного типа.
По внешним IP-адресам многие интернет-сервисы отслеживают новых и вернувшихся пользователей. Это позволяет собирать статистику и делать аналитику, важную для продвижения сайта.
Внутренний. Он же «серый», локальный или частный IP-адрес источника. Не используется во время доступа в Интернет. Работает только в пределах локальной сети (домашней или предоставленной провайдером), и доступ к нему можно получить только другим ее участникам. Для этой цели по умолчанию зарезервированы следующие диапазоны частных IP-адресов:
Необходимо понимать, что не всегда внешний IP-адрес является постоянным. Наоборот, IP часто формируется заново от одного подключения к другому.
В зависимости от вариантов определения
Статические. Это IP-адреса, являющиеся неизмененными (постоянными). Они назначаются устройству автоматически в момент его присоединения к компьютерной сети или прописываются пользователем вручную. Статические адреса доступны для использования неограниченное время. Они могут выполнять функцию идентификатора только для одного сетевого узла. Также иногда используется понятие псевдостатических адресов, которые работают в пределах одной частной сети.
Динамические. Это те IP-адреса, которые выдаются устройству на время. Они автоматически присваиваются в момент подключения к сети и имеют ограниченный срок действия (от начала сессии до ее завершения). Динамические IP-адреса – своеобразный способ маскировки. Отследить человека, выходящего в Интернет с помощью такого адреса, сложно технически, в этом случае не обойтись без профессиональных инструментов.
Что дает статический IP-адрес
Статический IP-адрес полезен благодаря следующим возможностям:
Как узнать IP-адрес
Зачем знать свой реальный IP-адрес? Он понадобится вам для того, чтобы начать работать с некоторыми сервисами, требующими его указания вручную. Каким образом получить информацию об IP? Есть как минимум два способа:
Помните, что вместе с IP-адресом другим устройствам (и, соответственно, лицам) будет доступна и иная информация, а именно: названия и данные провайдера интернет-услуг, название и версия установленной операционной системы и браузера, географическая привязка. Сторонние сервисы видят, используете ли вы прокси-сервер или средства защиты данных.
регулярное выражение javascript для проверки IP-адресов
у меня есть несколько ip-адресов, таких как:
какой тип регулярного выражения я должен написать, если я хочу искать все 3 ip-адреса? Например, если я сделаю 115.42.150.* (Я смогу искать все 3 ip-адреса)
что я могу сделать сейчас-это что-то вроде: /8<1-3>.9<1-3>.2<1-3>.5<1-3>/ но это не может работать хорошо.
17 ответов
регулярное выражение у вас уже есть несколько проблем:
во-первых, он содержит точки. В регулярном выражении точка означает «соответствовать любому символу», где вам нужно соответствовать только фактической точке. Для этого вам нужно избежать этого, поэтому поставьте перед точками косую черту.
во-вторых, но вы сопоставляете любые три цифры в каждом разделе. Это означает, что вы будете соответствовать любому номеру от 0 до 999, который, очевидно, содержит много недопустимых номеров IP-адресов.
Это может быть решается путем усложнения сопоставления чисел; на этом сайте есть другие ответы, которые объясняют, как это сделать, но, честно говоря, это не стоит усилий-на мой взгляд, вам было бы намного лучше разбить строку на точки, а затем просто проверить четыре блока как числовые целочисленные диапазоны-т. е.:
надеюсь, что это поможет.
может быть поздно, но кто-то может попробовать:
пример допустимого IP-адреса
пример недопустимого IP-адреса
код JavaScript для проверки IP-адреса
попробуйте этот, это более короткая версия:
What is the best way of validating an IP Address?
I have a method to validate a parameter IP Address. Being new to development as a whole I would like to know if there is a better way of doing this.
Its simple (I could do it) but it seems to do the trick.
11 Answers 11
Another approach to validate an IPv4 could be following :
It could be tested like:
The output will be:
You can also use IPAddress.TryParse but it has the limitations and could result in incorrect parsing.
Note that TryParse returns true if it parsed the input successfully, but that this does not necessarily mean that the resulting IP address is a valid one. Do not use this method to validate IP addresses.
But this would work with normal string containing at least three dots. Something like:
With IPAddress.TryParse you can check for existence of three dots and then call TryParse like:
Edit 1
Added some additional checks to prevent exceptions being thrown (which are costly). PS it won’t handle unicode.
Edit 2
@StephenMurby IPAddress.TryParse will return true if it successfully parsed the string. If you check the documentation for the method though it will throw an exception in two cases.
Its up to you to decide (design decision) whether you want to throw exceptions or return false. When it comes to parsing I generally prefer to return false rather than exceptions (the assumption being this is input that’s not guaranteed to be correct).
Breaking the return statement down, I am saying,
Remember C# boolean expressions are lazy evaluated, so the CLR won’t attempt to even parse the string if it is null or empty.
About the missing if, you can do something like,
But all you really doing is saying if something is true, return true. Easier to just return the expression straight away.








