validator.js предоставляет набор утилит для валидации строковых данных, включая адреса, домены и IP. В контексте URL особое значение имеет корректное определение того, используется ли в качестве хоста IP-адрес, а также его соответствие стандартам IPv4 или IPv6.
URL может содержать IP-адрес вместо доменного имени:
http://192.168.0.1/loginhttp://[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
Библиотека предоставляет метод:
validator.isIP(str [, version])
const validator = require('validator');
validator.isIP('192.168.0.1', 4); // true
validator.isIP('192.168.0.999', 4); // false
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
Без указания версии выполняется проверка на оба стандарта.
Основная задача — определить, является ли 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 заключён в квадратные скобки, но URL.hostname
возвращает его без них:
const url = new URL('http://[2001:db8::1]/api');
console.log(url.hostname); // 2001:db8::1
validator.isIP(url.hostname, 6); // true
Метод:
validator.isURL(str, options)
позволяет учитывать IP-адреса как допустимые хосты.
validator.isURL('http://192.168.0.1', {
require_protocol: true,
allow_ip: true
});
true — разрешает IP-адреса как hostfalse — допускаются только доменыПрактический вариант объединённой проверки:
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;
}
const url = new URL('http://192.168.0.1:8080');
validator.isIP(url.hostname); // true
Порт автоматически исключается из hostname.
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 — проверка адресаНекоторые 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;
}
validator.isIP('http://192.168.0.1'); // false
IP должен проверяться отдельно от протокола и пути.
validator.isIP('[2001:db8::1]'); // false
Скобки должны быть удалены через URL.hostname.
При обработке пользовательских вводов:
проверка 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.')
);
}
isURLisIP