Санитизация данных

Санитизация данных в AutoNumeric представляет собой многоуровневый процесс преобразования «сырых» пользовательских и программных значений в строго нормализованный числовой формат, соответствующий заданной локали и набору правил форматирования. В основе работы библиотеки лежит идея полного контроля над входным потоком символов с последующей детерминированной трансформацией в числовое представление без потерь и неоднозначностей.

AutoNumeric обрабатывает несколько типов входных данных, каждый из которых проходит собственный путь очистки:

  • ввод с клавиатуры;
  • вставка из буфера обмена;
  • программная установка значения через API;
  • изменение значения через колесо мыши;
  • автозаполнение браузера.

Каждый источник рассматривается как потенциально «грязный», поскольку может содержать символы, не относящиеся к допустимому числовому формату: буквы, пробелы, нестандартные разделители, символы валют, невидимые Unicode-символы.

Санитизация начинается до момента отображения значения в input и продолжается при каждом изменении состояния элемента.

Нормализация символов и первичная фильтрация

Первый этап очистки — приведение входной строки к каноническому виду. На этом уровне AutoNumeric выполняет:

  • удаление всех символов, не входящих в допустимый набор;
  • замену локализованных разделителей на внутренние стандарты;
  • устранение невидимых символов (zero-width space, non-breaking space);
  • нормализацию Unicode-символов.

Например, входная строка:

"€ 1 234,56abc"

после первичной санитизации превращается в промежуточное представление:

"1234.56"

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

Обработка разделителей и локализация

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

  • decimalCharacter
  • digitGroupSeparator

Эти настройки определяют, какие символы считаются валидными в контексте числа.

При обработке входа выполняется следующая логика:

  1. Все возможные альтернативные разделители заменяются на стандартные.
  2. Определяется позиция десятичной части.
  3. Групповые разделители полностью удаляются.
  4. Проверяется корректность структуры числа.

Особое внимание уделяется ситуациям, когда пользователь вводит число в «человеческом» формате:

1.234.567,89

Для локали de-DE это корректный формат, но для en-US он требует трансформации:

1234567.89

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

Санитизация при вставке (paste event)

Вставка из буфера обмена считается наиболее «грязным» источником данных. В этом случае библиотека применяет расширенный пайплайн:

  1. Перехват события paste до вставки в DOM.
  2. Извлечение текстового содержимого.
  3. Удаление HTML-разметки и управляющих символов.
  4. Прогон через числовой парсер AutoNumeric.
  5. Повторное форматирование результата.

Если вставляемая строка содержит смешанные данные:

Total: <b>12,300.50 USD</b>

результатом станет:

12300.50

При этом любые HTML-инъекции полностью нейтрализуются на уровне текстового извлечения, что делает невозможным внедрение DOM-элементов через input-поле.

Строгий режим и допустимые символы

AutoNumeric поддерживает строгую модель интерпретации входных данных. В строгом режиме:

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

Пример:

"12a34b56"

преобразуется в:

123456

При этом библиотека не пытается «угадывать» намерение пользователя, а действует детерминированно.

Работа с отрицательными числами

Санитизация отрицательных значений зависит от конфигурации:

  • allowLeadingMinus
  • negativePositiveSignPlacement

Вход:

--12,34

преобразуется в:

-12.34

Двойные знаки минуса и некорректные позиции символа полностью устраняются на этапе нормализации.

Обработка валютных и посторонних символов

Символы валюты ($, , ) и текстовые суффиксы удаляются либо игнорируются в зависимости от конфигурации:

  • currencySymbol
  • currencySymbolPlacement

Пример входа:

$ 1,200.00 USD

После санитизации:

1200.00

Важно, что символ валюты не участвует в числовой интерпретации и никогда не сохраняется в raw-значении.

Внутреннее представление и raw-значение

AutoNumeric разделяет два слоя данных:

  • форматированное значение (отображаемое в input);
  • сырое значение (числовое представление без форматирования).

Методы:

  • getNumber()
  • getNumericString()
  • getFormatted()

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

Санитизация всегда приводит к одному каноническому виду:

"1234.56"

независимо от локали отображения.

Пошаговый пайплайн санитизации

Внутренний процесс обработки входа можно представить как последовательность этапов:

  1. Приём входного значения.
  2. Удаление недопустимых Unicode-символов.
  3. Нормализация пробелов и разделителей.
  4. Приведение к стандартной десятичной форме.
  5. Проверка на соответствие числовому паттерну.
  6. Преобразование в внутренний numeric type.
  7. Форматирование для отображения.

Каждый этап является детерминированным и не зависит от внешнего состояния DOM.

Обработка ошибок и некорректных данных

При столкновении с некорректными строками AutoNumeric применяет стратегию «best effort sanitization»:

  • если число частично валидно — извлекается валидная часть;
  • если число полностью невалидно — возвращается пустое или нулевое значение (в зависимости от конфигурации);
  • если присутствуют смешанные символы — приоритет всегда у числовых токенов.

Пример:

"abc"

→ пустое значение или 0 (в зависимости от настроек)

"10..20"

10.20

Программная санитизация через API

При установке значения программно:

anElement.set("1,23a4.50");

AutoNumeric не доверяет входной строке и всегда прогоняет её через тот же пайплайн, что и пользовательский ввод.

Это обеспечивает консистентность между:

  • UI-вводом;
  • вставкой;
  • API-изменениями.

Интеграция санитизации с событиями

Санитизация тесно связана с жизненным циклом событий:

  • input
  • keydown
  • paste
  • wheel
  • blur

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

Например, при blur выполняется финальная нормализация, которая гарантирует, что значение соответствует формату даже при незавершённом вводе.

Защитные аспекты санитизации

Хотя AutoNumeric не является библиотекой безопасности в чистом виде, её механизм очистки снижает ряд рисков:

  • исключение HTML/JS инъекций через input;
  • устранение управляющих Unicode-символов;
  • предотвращение подмены числового значения через форматирование;
  • контроль над экспоненциальной записью в неподдерживаемых режимах.

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

Кастомизация правил очистки

Поведение санитизации полностью определяется конфигурацией:

  • разрешённые символы;
  • формат десятичной части;
  • правила группировки;
  • поведение при вставке;
  • обработка пустых и некорректных значений.

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