BiDi‑контролы и скрытые изменения направления текста: примеры реальных проблем

BiDi‑символы (Bidirectional controls) — это управляющие символы Unicode, которые задают или переопределяют направление текста (слева направо или справа налево). Они жизненно необходимы для корректного отображения смешанных письменностей — например, арабского текста с латинскими числами.

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

Какие BiDi‑символы встречаются чаще всего

На практике чаще всего обнаруживаются:

  • RLO / LRO (Right-to-Left / Left-to-Right Override) — полностью меняют порядок символов;
  • RLE / LRE — принудительное направление блока текста;
  • PDF (Pop Directional Formatting) — завершает действие предыдущих;
  • LRM / RLM — маркеры направления, визуально незаметные.

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

Пример 1: визуально корректный, логически неправильный текст

Строка выглядит так:

invoice_12345.pdf

Но внутри неё присутствует RLO, из-за чего фактический порядок символов может быть:

invoice_54321.pdf

Пользователь видит одно имя файла, система обрабатывает другое.

Это критично для:

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

Пример 2: опасность в коде и конфигурациях

В исходном коде строка может выглядеть безопасно:

if (isAdmin) allowAccess();

Но с BiDi‑контролами реальный порядок может быть иным, например:

  • комментарий визуально «перекрывает» код;
  • часть инструкции выглядит закомментированной, но реально исполняется.

Такие техники уже использовались для маскировки вредоносного кода и усложнения code review.

Пример 3: сбои при копировании и передаче данных

Текст:

Order ID: ABC123

После копирования в другую систему:

  • символы меняют порядок;
  • регулярные выражения не совпадают;
  • идентификатор не проходит проверку.

В логах и CRM это выглядит как «случайная ошибка», хотя причина — скрытые BiDi‑контролы.

Пример 4: юридические и финансовые документы

В договорах и счетах:

  • номер документа визуально читается корректно;
  • при экспорте в PDF, CSV или XML порядок символов меняется;
  • автоматическая проверка подписей или номеров даёт сбой.

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

Пример 5: поиск, сортировка и аналитика

Для аналитических систем BiDi‑контролы — это полноценные символы:

  • строки, выглядящие одинаково, считаются разными;
  • сортировка даёт неожиданные результаты;
  • поиск не находит «очевидные» совпадения.

В больших датасетах такие ошибки могут искажать отчёты месяцами.

Почему BiDi‑контролы нельзя хранить в пользовательских данных

В большинстве систем:

  • нет необходимости управлять направлением текста на уровне данных;
  • направление определяется интерфейсом (CSS, UI‑логика);
  • хранение BiDi‑контролов не даёт преимуществ, но увеличивает риски.

Они:

  • усложняют отладку;
  • мешают валидации;
  • создают векторы атак и ошибок.

Рекомендованная практика

Для безопасной обработки данных рекомендуется:

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

Вывод

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

Текст может выглядеть корректно для человека и при этом быть логически искажённым для системы.

Удаление BiDi‑символов — это не упрощение, а базовая мера надёжности, безопасности и предсказуемости данных.