Проверка IP-адресов в URL

validator.js предоставляет набор утилит для валидации строковых данных, включая адреса, домены и IP. В контексте URL особое значение имеет корректное определение того, используется ли в качестве хоста IP-адрес, а также его соответствие стандартам IPv4 или IPv6.


Разбор структуры URL с IP-адресом

URL может содержать IP-адрес вместо доменного имени:

  • IPv4: http://192.168.0.1/login
  • IPv6: http://[2001:db8::1]/api

Для корректной обработки таких случаев требуется разделение URL на компоненты и последующая проверка host-части.

В Node.js базовый разбор выполняется через встроенный модуль:

const { URL } = require('url');

const parsed = new URL('http://192.168.0.1/login');
console.log(parsed.hostname); // 192.168.0.1

Определение IP-адреса через validator.js

Библиотека предоставляет метод:

validator.isIP(str [, version])

Проверка IPv4

const validator = require('validator');

validator.isIP('192.168.0.1', 4); // true
validator.isIP('192.168.0.999', 4); // false

Проверка IPv6

validator.isIP('2001:db8::1', 6); // true
validator.isIP('2001::25de::cade', 6); // false

Универсальная проверка

validator.isIP('127.0.0.1'); // true
validator.isIP('::1');       // true

Без указания версии выполняется проверка на оба стандарта.


Проверка IP внутри URL

Основная задача — определить, является ли host в URL IP-адресом.

Базовый подход

const validator = require('validator');
const { URL } = require('url');

function isURLWithIP(input) {
  const parsed = new URL(input);
  const host = parsed.hostname;

  return validator.isIP(host);
}

isURLWithIP('http://192.168.0.1/login'); // true
isURLWithIP('https://example.com');      // false

Учет IPv6 в URL

IPv6 в URL заключён в квадратные скобки, но URL.hostname возвращает его без них:

const url = new URL('http://[2001:db8::1]/api');

console.log(url.hostname); // 2001:db8::1
validator.isIP(url.hostname, 6); // true

Валидация URL с IP через isURL

Метод:

validator.isURL(str, options)

позволяет учитывать IP-адреса как допустимые хосты.

Включение поддержки IP

validator.isURL('http://192.168.0.1', {
  require_protocol: true,
  allow_ip: true
});

Поведение параметра allow_ip

  • true — разрешает IP-адреса как host
  • false — допускаются только домены

Комплексная проверка URL с IP

Практический вариант объединённой проверки:

const validator = require('validator');
const { URL } = require('url');

function validateURLHost(input) {
  if (!validator.isURL(input, { require_protocol: true })) {
    return false;
  }

  const host = new URL(input).hostname;

  const isIPv4 = validator.isIP(host, 4);
  const isIPv6 = validator.isIP(host, 6);

  return isIPv4 || isIPv6;
}

Обработка пограничных случаев

URL с портом

const url = new URL('http://192.168.0.1:8080');

validator.isIP(url.hostname); // true

Порт автоматически исключается из hostname.


Некорректные IP в URL

const url = 'http://999.999.999.999';

validator.isURL(url); // true (по формату URL)
validator.isIP(new URL(url).hostname); // false

Это демонстрирует необходимость двойной проверки: формата URL и корректности IP.


Ограничения встроенной валидации

isURL не гарантирует корректность IP внутри host, если не включена дополнительная проверка через isIP. Поэтому распространённый подход включает комбинацию:

  • validator.isURL — проверка структуры
  • validator.isIP — проверка адреса

Проверка IPv4-мэппинга IPv6

Некоторые IPv6 адреса могут включать IPv4 отображение:

::ffff:192.168.0.1
validator.isIP('::ffff:192.168.0.1'); // true

Практический шаблон валидации

const validator = require('validator');
const { URL } = require('url');

function strictURLCheck(input) {
  if (!validator.isURL(input, { require_protocol: true })) {
    return false;
  }

  const hostname = new URL(input).hostname;

  if (validator.isIP(hostname, 4)) return true;
  if (validator.isIP(hostname, 6)) return true;

  return false;
}

Типовые ошибки при проверке IP в URL

Ошибка: проверка всей строки как IP

validator.isIP('http://192.168.0.1'); // false

IP должен проверяться отдельно от протокола и пути.


Ошибка: игнорирование IPv6 скобок

validator.isIP('[2001:db8::1]'); // false

Скобки должны быть удалены через URL.hostname.


Использование в серверной валидации

При обработке пользовательских вводов:

  • API endpoint URL
  • настройки webhook
  • whitelist серверов

проверка IP внутри URL предотвращает подмену доменов на локальные или зарезервированные адреса (127.0.0.1, 10.0.0.0/8).


Сочетание с дополнительными фильтрами

validator.js не выполняет проверку диапазонов IP, поэтому часто добавляется логика:

function isPrivateIP(ip) {
  return (
    ip.startsWith('10.') ||
    ip.startsWith('192.168.') ||
    ip.startsWith('127.')
  );
}

Итоговая схема обработки

  1. Проверка структуры URL через isURL
  2. Извлечение hostname
  3. Проверка через isIP
  4. Дополнительная фильтрация диапазонов
  5. Принятие или отклонение значения