Детектор скрытых символов
Вставьте текст — детектор подсветит каждый найденный невидимый символ Unicode: пробелы нулевой ширины, соединители, направляющие метки и мягкие переносы, каждый с пометкой кода.
Символы, которые ищет этот инструмент
Распространённые невидимые символы Unicode, которые ищет детектор, и что на самом деле делает каждый из них
Отмечает возможность переноса строки. Может быть встроен в идентификатор, чтобы он совпадал иначе, чем читается.
Предотвращает соединение символов в курсивных письменностях вроде арабской и персидской. Невидим, но меняет, как соединяются соседние глифы.
Клей в ZWJ-последовательностях эмодзи — эмодзи семьи это четыре эмодзи, склеенные тремя символами U+200D, отрисовываемые как один глиф.
Принудительно задаёт направление текста слева направо без видимого глифа. Нужна в смешаннонаправленном тексте; злоупотребляется в bidi-подменах.
Принудительно задаёт направление справа налево. Двойное применение как у U+200E — нужна для иврита и арабского, используется в фишинге.
Невидим, пока строка не разрывается в этой позиции — тогда отрисовывается как дефис. Часто попадает в текст случайно при копировании из PDF.
Почему невидимые символы — настоящая проблема
Невидимые символы Unicode существуют по уважительным причинам — управление переносами, соединение в курсивных письменностях, двунаправленный текст, опциональная расстановка переносов. Но поскольку они не отрисовываются, они же служат инструментом злоупотреблений. Работа Trojan Source (CVE-2021-42574, раскрыто в октябре 2021) показала, что символы двунаправленного переопределения могут заставить исходный код компилироваться не так, как он читается на экране. Сопутствующее раскрытие (CVE-2021-42694) описало атаки гомоглифами, где кириллическая а (U+0430) заменяет латинскую a (U+0061) в имени функции. Ближе к обычному использованию — символы нулевой ширины вставляют в имена пользователей и идентификаторы, чтобы две одинаково читающиеся строки сравнивались как разные. Детектор, показывающий эти символы по коду, — самый быстрый способ их найти, потому что глазом их не различить.
Для чего это полезно
Что должна искать серьёзная проверка
Шесть символов выше — самые частые, но это не полная картина. Серьёзная проверка покрывает несколько диапазонов. Форматные символы нулевой ширины с U+200B по U+200F закрывают возможности переноса, соединители и направляющие метки. U+2060 (соединитель слов) и U+FEFF (метка порядка байтов, когда она в середине потока) тоже нулевой ширины. Блок двунаправленного переопределения — с U+202A по U+202E, плюс с U+2066 по U+2069 — это то, что эксплуатирует Trojan Source. U+00AD (мягкий перенос) невидим до переноса строки. Хангыльские заполнители U+115F и U+3164 и брайлевский пробел U+2800 не отрисовываются, но занимают знакоместо, что удобно для прятания содержимого на виду. Поиск похожих символов — связанная, но отдельная задача: кириллическая а и латинская a обе видимы, поэтому детектор символов их не пометит. Для этого нужна проверка по данным confusables из Unicode, которые отображают похожие символы в нормализованный остов.
Как пользоваться детектором
Вставляйте только тот текст, который хотите проверить. Всё выполняется в вашем браузере; ничего не загружается.
Используйте цветовую кодировку, чтобы отличать типы символов с первого взгляда — красный для ZWSP, зелёный для ZWJ, оранжевый для RLM и так далее.
После обнаружения нажмите «Удалить», чтобы вырезать все невидимые символы, затем «Скопировать чистый текст», чтобы получить очищенную версию.
Проверяйте любое имя, slug или идентификатор, пришедший от пользовательского ввода, перед сохранением или сравнением.
Если сравнение строк не проходит, а строки выглядят одинаково — вставьте их обе сюда, скрытый U+200B обычная причина.
Для исходного кода от третьих лиц проверяйте диапазон с U+202A по U+202E перед чтением. Это bidi-переопределения, лежащие в основе Trojan Source.
Как работает детектор
Детектор полностью работает в вашем браузере как JavaScript. Текст не покидает устройство, что важно, когда вы вставляете чувствительные идентификаторы или исходный код. Работает в Chrome, Firefox, Safari, Edge и любом современном браузере на десктопе или мобильном. Он ищет символы нулевой ширины в диапазоне с U+200B по U+200F, bidi-переопределения с U+202A по U+202E и с U+2066 по U+2069, соединитель слов U+2060, мягкий перенос U+00AD и метку порядка байтов U+FEFF, когда она вне первой позиции файла. Учтите, что он помечает невидимые символы по коду; он не обнаруживает гомоглифы — видимые символы, которые просто похожи на другие.
