Валидация MAC-адресов

MAC-адрес представляет собой уникальный идентификатор сетевого интерфейса, закреплённый за оборудованием на канальном уровне модели OSI. Он используется для адресации устройств внутри локальных сетей и состоит из шестибайтного (48-битного) или восьмибайтного (64-битного) представления в зависимости от стандарта (EUI-48 или EUI-64).

Формат записи MAC-адреса строго регламентирован и может быть представлен несколькими вариантами:

  • шесть групп по два шестнадцатеричных символа, разделённых двоеточиями: AA:BB:CC:DD:EE:FF
  • аналогичный формат с дефисами: AA-BB-CC-DD-EE-FF
  • точечная запись (реже): AABB.CCDD.EEFF
  • непрерывная строка: AABBCCDDEEFF

Несмотря на различия в отображении, базовая структура остаётся неизменной: 48 бит, разделённые на организационно уникальный идентификатор производителя (OUI) и идентификатор устройства.


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

Основная функция:

validator.isMACAddress(input[, options])

где input — проверяемая строка, а options — объект конфигурации формата.


Поддерживаемые форматы MAC-адресов

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

  • any — любой допустимый формат
  • EUI-48 — классический 48-битный MAC-адрес
  • EUI-64 — расширенный 64-битный формат

Также поддерживаются различные разделители:

  • двоеточие :
  • дефис -
  • отсутствие разделителей

Базовая проверка MAC-адреса

Простейший пример проверки:

import validator from 'validator';

validator.isMACAddress('AA:BB:CC:DD:EE:FF');

Функция вернёт true, если строка соответствует стандартному MAC-адресу формата EUI-48.


Проверка без привязки к формату

Если требуется принять любой корректный MAC-адрес, используется параметр any:

validator.isMACAddress('AA-BB-CC-DD-EE-FF', {
  no_colons: false
});

или более явно:

validator.isMACAddress('AABB.CCDD.EEFF', {
  format: 'any'
});

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


Проверка строгого EUI-48 формата

EUI-48 является наиболее распространённым вариантом MAC-адреса. Он предполагает строго 48 бит и стандартное представление:

validator.isMACAddress('AA:BB:CC:DD:EE:FF', {
  format: 'eui48'
});

Любые отклонения, включая неправильный разделитель или неверную длину, приводят к отрицательному результату.


Проверка EUI-64

EUI-64 используется реже и чаще встречается в автоматической конфигурации IPv6:

validator.isMACAddress('AA:BB:CC:DD:EE:FF:11:22', {
  format: 'eui64'
});

В этом случае строка должна содержать восемь октетов, каждый из которых представлен двумя шестнадцатеричными символами.


Работа с разделителями

Validator.js позволяет контролировать допустимые символы-разделители:

validator.isMACAddress('AA-BB-CC-DD-EE-FF', {
  format: 'eui48',
  delimiter: '-'
});

Если передан другой разделитель, проверка завершится неудачей.

Возможные сценарии:

  • только двоеточия
  • только дефисы
  • смешанные форматы (не допускаются при строгой валидации)

Нормализация входных данных перед проверкой

Перед валидацией часто требуется предварительная очистка строки:

const normalizeMac = (value) =>
  value.replace(/[^a-fA-F0-9]/g, '');

validator.isMACAddress(normalizeMac('AA-BB-CC-DD-EE-FF'));

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


Регистрозависимость и шестнадцатеричные символы

MAC-адреса могут содержать буквы от A до F в верхнем или нижнем регистре. Validator.js не чувствителен к регистру:

validator.isMACAddress('aa:bb:cc:dd:ee:ff');
validator.isMACAddress('AA:BB:CC:DD:EE:FF');

Оба варианта считаются корректными, так как сравнение выполняется в рамках шестнадцатеричного диапазона.


Типичные ошибки при валидации

При работе с MAC-адресами часто встречаются ошибки, которые Validator.js позволяет отлавливать автоматически:

  1. Неверная длина

    • меньше или больше 6/8 октетов
  2. Недопустимые символы

    • использование не шестнадцатеричных символов (G, Z, @)
  3. Смешанные разделители

    • AA:BB-CC:DD:EE:FF
  4. Отсутствие разделителей при неправильной длине

    • AABBCCDDEEFFGG

Интеграция в серверную валидацию

При обработке сетевых конфигураций MAC-адрес часто передаётся как часть JSON-объекта:

app.post('/device', (req, res) => {
  const { mac } = req.body;

  if (!validator.isMACAddress(mac)) {
    return res.status(400).send('Invalid MAC address');
  }

  // дальнейшая обработка
});

Такой подход используется в API управления сетевыми устройствами, системах мониторинга и DHCP-сервисах.


Использование в формах ввода

На клиентской стороне MAC-адрес часто валидируется до отправки:

function validateForm(mac) {
  return validator.isMACAddress(mac, { format: 'any' });
}

Дополнительно может применяться форматирование в реальном времени, когда пользователь вводит значение, а система автоматически добавляет разделители после каждого второго символа.


Сравнение с регулярными выражениями

Ручная проверка MAC-адреса через регулярное выражение выглядит следующим образом:

const regex = /^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/;
regex.test('AA:BB:CC:DD:EE:FF');

Однако такой подход:

  • не учитывает EUI-64
  • требует отдельной поддержки форматов
  • усложняется при расширении логики

Validator.js абстрагирует эти детали, предоставляя единый интерфейс проверки.


Использование в системах сетевой идентификации

Валидация MAC-адресов критична в следующих сценариях:

  • фильтрация устройств по MAC в корпоративных сетях
  • контроль доступа на уровне коммутаторов
  • регистрация устройств в IoT-платформах
  • привязка лицензий к оборудованию
  • анализ сетевых логов

В этих задачах некорректный MAC-адрес может привести к нарушению логики маршрутизации или ошибкам идентификации устройств.


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

Некоторые системы принимают нестандартные представления MAC-адресов:

  • с пробелами: AA BB CC DD EE FF
  • с префиксами: MAC: AA:BB:CC:DD:EE:FF
  • в URI-строках или JSON с экранированием

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


Поведение при пустых значениях

Функция isMACAddress возвращает false для:

  • пустой строки
  • null
  • undefined
  • нестроковых типов (если не приведены к строке)

Поэтому перед проверкой часто используется явное преобразование:

validator.isMACAddress(String(mac || ''));

Практика комбинирования с другими валидаторами

MAC-адрес часто является частью комплексной проверки устройства:

validator.isMACAddress(mac) &&
validator.isIP(ip) &&
validator.isUUID(deviceId);

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