Параметры хоста и порта

Хост и порт являются ключевыми компонентами URL-строк, и в библиотеке Validator.js их обработка реализована через набор параметров функции проверки URL, прежде всего isURL. Эти параметры позволяют гибко управлять тем, какие адреса считаются допустимыми, а какие должны быть отклонены на этапе валидации.

В контексте URL хост определяет доменное имя или IP-адрес ресурса, а порт указывает на конкретный сетевой сервис внутри этого хоста. Например:

https://example.com:443
  • example.com — хост
  • 443 — порт

В Validator.js эти элементы рассматриваются как часть общей структуры URL и могут быть строго ограничены через конфигурационные параметры.

Параметры функции isURL, связанные с хостом

Функция validator.isURL(str, options) предоставляет набор опций, которые напрямую влияют на проверку хоста.

require_host

Параметр require_host определяет, обязателен ли хост в URL.

  • true — URL без хоста будет считаться невалидным
  • false — допускаются относительные или нестандартные формы URL

Пример поведения:

validator.isURL('http:///path', { require_host: true })  // false
validator.isURL('http:///path', { require_host: false }) // может быть true в зависимости от других опций

Этот параметр часто используется в системах, где важно строгое соответствие стандартному формату URL.

host_whitelist

Позволяет задать список разрешённых хостов.

{
  host_whitelist: ['example.com', 'api.example.com']
}

Если URL содержит хост, отсутствующий в списке, валидация не пройдёт.

Особенности:

  • сравнение идёт строго по строке хоста
  • поддомены должны быть явно указаны, если они допустимы

Пример:

validator.isURL('https://example.com', { host_whitelist: ['example.com'] }) // true
validator.isURL('https://test.com', { host_whitelist: ['example.com'] })     // false

host_blacklist

Обратный механизм — список запрещённых хостов.

{
  host_blacklist: ['malicious.com']
}

Используется для фильтрации нежелательных или потенциально опасных доменов.

Пример:

validator.isURL('https://malicious.com', { host_blacklist: ['malicious.com'] }) // false

Часто применяется в системах безопасности, где нужно исключить известные вредоносные источники.

allow_protocol_relative_urls

Хотя параметр не относится напрямую к хосту, он влияет на его наличие в строке.

{
  allow_protocol_relative_urls: true
}

Пример:

'//example.com/path'

Такие URL не содержат протокол, но содержат хост. Валидация зависит от настройки require_host.

Работа с портом

Порт в URL задаётся через двоеточие после хоста:

http://example.com:3000

Validator.js не имеет отдельного параметра require_port, но управление портом осуществляется косвенно через isURL и дополнительные проверки.

Проверка наличия порта

Для анализа порта обычно комбинируют isURL и дополнительные методы.

Пример:

const url = 'http://example.com:8080'

Порт можно извлечь и проверить отдельно:

validator.isPort('8080')

Функция isPort проверяет:

  • является ли строка числом
  • входит ли значение в диапазон 0–65535

Ограничение портов через регулярные правила

В Validator.js нет встроенного whitelist/blacklist для портов, поэтому ограничения реализуются вручную:

const allowedPorts = ['80', '443']

const port = '8080'
const isAllowed = allowedPorts.includes(port)

Такой подход часто используется в API-шлюзах и прокси-сервисах.

Поведение при отсутствии порта

URL без порта считается корректным, если:

  • протокол имеет стандартный порт по умолчанию
  • isURL не требует явного указания порта

Пример:

https://example.com

В этом случае порт подразумевается как 443, но не указывается явно.

Комбинированные параметры хоста и порта в isURL

На практике параметры хоста и порта работают совместно с другими настройками:

validator.isURL(url, {
  require_host: true,
  host_whitelist: ['example.com'],
  protocols: ['http', 'https']
})

Такой набор обеспечивает:

  • строгую проверку домена
  • ограничение используемых протоколов
  • контроль структуры URL

Пример строгой конфигурации

{
  require_host: true,
  require_protocol: true,
  protocols: ['https'],
  host_whitelist: ['api.example.com']
}

В этом случае допустим только:

https://api.example.com

Любой порт при этом не влияет на валидность, если он корректен синтаксически.

Типичные сценарии использования

1. Ограничение API-доменов

host_whitelist: ['api.service.com']

Используется для защиты от подмены домена в клиентских запросах.

2. Запрет внутренних или локальных адресов

host_blacklist: ['localhost', '127.0.0.1']

Применяется для предотвращения SSRF-уязвимостей.

3. Контроль сервисных портов

validator.isPort(port)
allowedPorts.includes(port)

Используется в микросервисной архитектуре, где каждый сервис привязан к фиксированному порту.

Особенности обработки IPv4 и IPv6

Хост может быть представлен IP-адресом:

http://192.168.0.1:3000
http://[2001:db8::1]:443

Validator.js учитывает:

  • корректность IP-формата
  • допустимость порта после IP
  • наличие квадратных скобок для IPv6

При использовании host_whitelist IP-адреса должны указываться явно в том же формате, что и в URL.

Ошибки при работе с хостом и портом

1. Неполное указание поддомена

host_whitelist: ['example.com']

URL:

https://api.example.com

Результат: невалиден, так как поддомен не включён в список.

2. Попытка проверки порта внутри isURL

Validator.js не выделяет порт как отдельную сущность в isURL, поэтому попытки управлять портом через URL-опции часто приводят к ошибочному ожиданию поведения.

3. Некорректный формат IPv6

http://2001:db8::1:443

Правильно:

http://[2001:db8::1]:443

Поведение в реальных приложениях

В серверных приложениях на Node.js параметры хоста и порта часто комбинируются с Validator.js на уровне входных DTO:

  • проверка URL через isURL
  • извлечение хоста через парсинг
  • отдельная валидация порта через isPort
  • сравнение с политиками безопасности

Такой подход позволяет разделить:

  • синтаксическую проверку (Validator.js)
  • бизнес-ограничения (логика приложения)