Защита от инъекций

Интернационализация в JavaScript-приложениях часто становится скрытой зоной риска: данные, полученные из внешних источников (CMS, пользовательский ввод, API переводов), проходят через слой форматирования и попадают в UI. Библиотека Globalize, опирающаяся на CLDR-данные, предоставляет инструменты форматирования чисел, дат, сообщений и склонений, но не выполняет автоматическую санитарную обработку вывода. Это создаёт условия, при которых неправильная композиция форматтеров может привести к инъекциям на уровне отображения.

Ключевой принцип: Globalize безопасен только в пределах корректного использования форматирования; безопасность итогового вывода определяется контекстом рендеринга.


Основные классы инъекций в контексте Globalize

HTML-инъекция через форматированные строки

Наиболее распространённый риск возникает при использовании результата форматирования как HTML без экранирования.

Globalize возвращает строки, не содержащие HTML-санитизации. При последующей вставке в innerHTML возможно выполнение внедрённой разметки:

  • пользовательский ввод попадает в сообщение
  • сообщение форматируется через messageFormatter
  • результат вставляется в DOM как HTML

Даже если CLDR-шаблоны корректны, источник опасности находится в данных, а не в библиотеке.

Критический сценарий возникает при смешении:

  • локализованных шаблонов
  • неэкранированных параметров
  • HTML-контекста вывода

Инъекция через шаблоны сообщений (Message Formatting Injection)

Globalize поддерживает форматирование сообщений на основе ICU-подобных шаблонов. При динамическом формировании шаблонов без контроля возможно подмешивание управляющих конструкций.

Опасные паттерны возникают при:

  • сборке шаблонов из пользовательских строк
  • хранении сообщений в редактируемых источниках без валидации
  • объединении нескольких источников переводов

Проблема заключается не в синтаксисе CLDR, а в том, что шаблон сообщения становится интерпретируемым кодом форматирования.


Косвенная инъекция через параметры форматирования

Даже при статических шаблонах инъекция возможна через параметры:

  • числовые значения, используемые в строках без экранирования
  • строки, содержащие управляющие символы Unicode
  • подстановки, влияющие на структуру сообщения

Особую опасность представляют:

  • bidirectional override символы (LTR/RTL)
  • невидимые разделители
  • комбинируемые Unicode-символы

Такие данные способны искажать визуальное представление интерфейса без нарушения синтаксиса HTML.


Контекстная инъекция при смешивании форматов

Globalize часто используется совместно с HTML-шаблонизаторами, React/Vue или серверным рендерингом. Ошибки возникают при переходе между контекстами:

  • текстовый контекст → HTML-контекст
  • безопасная строка → небезопасный render
  • форматирование → конкатенация строк

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


Поведение Globalize с точки зрения безопасности

Globalize выполняет строго определённую функцию:

  • интерпретирует CLDR-данные
  • форматирует значения (числа, даты, сообщения)
  • возвращает строковый результат

При этом отсутствуют механизмы:

  • HTML-escaping
  • sanitization
  • validation входных данных
  • защита от контекстных инъекций

Это означает, что библиотека находится на уровне логики представления, а не безопасности.


Опасные паттерны использования

Конкатенация строк вместо параметризации

Наиболее частая причина уязвимостей:

  • формирование сообщений через +
  • вставка переменных напрямую в строку
  • обход message formatter ради удобства

Такой подход разрушает структуру шаблонов и переносит ответственность за экранирование на внешние слои.


Использование innerHTML с результатами форматирования

Любой результат Globalize может содержать данные, пришедшие из недоверенного источника. При вставке в DOM через HTML-интерпретатор создаётся поверхность для XSS.

Особенно опасно сочетание:

  • messageFormatter
  • пользовательских данных
  • HTML-шаблонов интерфейса

Небезопасные источники переводов

Если локализация загружается динамически (CMS, API, админ-панель), появляется риск внедрения:

  • HTML-тегов
  • скриптовых конструкций
  • поломанных ICU-шаблонов

Отсутствие валидации на уровне хранилища переводов переносит уязвимость в рантайм.


Принципы безопасного использования

Разделение контекстов данных и отображения

Форматирование через Globalize должно оставаться изолированным от логики рендеринга HTML. Результат рассматривается как plain text до момента безопасного экранирования.


Контроль шаблонов сообщений

Шаблоны сообщений должны считаться кодом конфигурации:

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

Любая динамическая генерация шаблонов увеличивает поверхность атаки.


Экранирование на уровне UI-слоя

Безопасность обеспечивается не Globalize, а слоем отображения:

  • экранирование HTML-символов
  • использование текстовых узлов вместо HTML-вставки
  • запрет интерпретации строк как разметки

Изоляция данных Unicode

Особое внимание требуется к символам:

  • bidi override (LRE, RLE, PDF)
  • нулевой ширины
  • комбинируемые диакритические знаки

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


Форматирование сообщений как потенциальная зона исполнения

ICU-подобные шаблоны в Globalize поддерживают структурную интерполяцию. При неправильной архитектуре сообщения начинают вести себя как мини-язык выражений.

Риски усиливаются при наличии:

  • вложенных подстановок
  • динамических ключей сообщений
  • генерации шаблонов на лету

Любая интерпретация пользовательских данных внутри шаблона превращает систему в потенциальный вектор инъекций.


Архитектурные ограничения для снижения риска

Безопасная интеграция Globalize обычно строится вокруг следующих ограничений:

  • форматирование отделено от источников данных
  • все строки считаются недоверенными до экранирования
  • шаблоны сообщений неизменяемы в runtime
  • вывод в DOM осуществляется через текстовые узлы
  • запрещена генерация шаблонов из пользовательского ввода

Такая модель снижает вероятность перехода от i18n к XSS и template injection.


Связь локализации и поверхностей атаки

Интернационализация увеличивает количество входных точек:

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

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