Метод blacklist и whitelist

Валидация и очистка строковых данных часто разделяются на два подхода: ограничение допустимых символов и удаление нежелательных. В библиотеке Validator.js для этих задач используются методы blacklist и whitelist, ориентированные не на проверку формата, а на преобразование входных данных путём фильтрации символов.


blackList: удаление запрещённых символов

Метод blacklist удаляет из строки все символы, перечисленные в наборе запрещённых.

Сигнатура:

validator.blacklist(input, chars)
  • input — исходная строка
  • chars — строка, содержащая символы, которые необходимо удалить

Принцип работы

Каждый символ из набора chars удаляется из исходной строки независимо от его позиции. Операция не учитывает контекст, регистр или последовательности символов.

Пример использования

const validator = require('validator');

const str = "user:name@example.com";
const result = validator.blacklist(str, ":@");

console.log(result);
// "usernameexample.com"

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

Поведение и особенности

  • Удаление происходит побуквенно, без анализа токенов
  • Повторяющиеся символы в chars не влияют на результат
  • Метод не предназначен для сложной фильтрации, например удаления слов или паттернов
  • Часто используется для предварительной очистки перед дальнейшей валидацией

Типичные сценарии применения

  • Удаление разделителей (например, -, _, :)
  • Очистка пользовательского ввода от технических символов
  • Приведение строк к упрощённому виду перед сравнением

whiteList: разрешение только заданных символов

Метод whitelist выполняет обратную операцию: из строки удаляются все символы, которые не входят в заданный набор допустимых.

Сигнатура:

validator.whitelist(input, chars)
  • input — исходная строка
  • chars — строка допустимых символов

Принцип работы

Сохраняются только те символы, которые присутствуют в chars. Остальные полностью удаляются.

Пример использования

const validator = require('validator');

const str = "u$er12-na!me";
const result = validator.whitelist(str, "abcdefghijklmnopqrstuvwxyz0123456789");

console.log(result);
// "uer12name"

Удалены все символы, не входящие в список разрешённых: $, -, !.

Поведение и особенности

  • Работает как фильтр «разрешено всё, кроме»
  • Полезен при строгой нормализации входных данных
  • Может радикально изменять строку при узком наборе допустимых символов
  • Не сохраняет структуру исходной строки, если формат включает разделители

Типичные сценарии применения

  • Очистка строки до числового формата
  • Удаление спецсимволов из идентификаторов
  • Подготовка данных для систем с ограниченным набором символов (например, legacy API)

Сравнение подходов blacklist и whitelist

Оба метода решают задачу фильтрации, но различаются философией обработки данных:

  • blacklist удаляет нежелательные символы
  • whitelist оставляет только разрешённые символы

Поведенческая разница

validator.blacklist("a1b2c3", "abc"); // "12c3"
validator.whitelist("a1b2c3", "abc"); // "abc"

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


Влияние на безопасность и валидацию

Методы не являются полноценной защитой от атак и не заменяют экранирование или параметризованные запросы. Их роль ограничивается предварительной обработкой входных данных.

Ограничения безопасности

  • Не предотвращают SQL-инъекции
  • Не защищают от XSS без дополнительных мер
  • Не учитывают кодировки и Unicode-особенности сложных символов

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


Работа с Unicode и расширенными наборами символов

В контексте Unicode поведение методов остаётся побуквенным, однако состав chars требует аккуратного определения.

validator.whitelist("café-№1", "abcdefghijklmnopqrstuvwxyz");

Результат:

caf

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


Практические паттерны использования

Очистка телефонных номеров

validator.blacklist("+7 (777) 123-45-67", " ()-");
// "+77771234567"

Оставить только цифры

validator.whitelist("ID: 00987-AZ", "0123456789");
// "00987"

Упрощение пользовательских идентификаторов

validator.blacklist("user.name_2026", "._");
// "username2026"

Ошибки проектирования при использовании фильтрации

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

Типичные ошибки:

  • удаление значимых символов URL или email
  • некорректная обработка интернациональных символов
  • смешивание фильтрации и валидации в одном шаге
  • зависимость логики приложения от результата очистки

Роль методов в архитектуре обработки данных

blacklist и whitelist занимают промежуточный слой между сырыми входными данными и строгой валидацией. Их задача — нормализация формы строки, а не проверка её корректности.

В типичной цепочке обработки:

  1. Сырые данные
  2. Фильтрация символов (blacklist / whitelist)
  3. Проверка формата (regex, специализированные валидаторы)
  4. Бизнес-валидация

Такое разделение снижает сложность и делает поведение системы предсказуемым.