Free Tool

Детектор скрытых символов

Вставьте текст — детектор подсветит каждый найденный невидимый символ Unicode: пробелы нулевой ширины, соединители, направляющие метки и мягкие переносы, каждый с пометкой кода.

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

Символы, которые ищет этот инструмент

Распространённые невидимые символы Unicode, которые ищет детектор, и что на самом деле делает каждый из них

Пробел нулевой ширины
U+200B

Отмечает возможность переноса строки. Может быть встроен в идентификатор, чтобы он совпадал иначе, чем читается.

Разделитель нулевой ширины
U+200C

Предотвращает соединение символов в курсивных письменностях вроде арабской и персидской. Невидим, но меняет, как соединяются соседние глифы.

Соединитель нулевой ширины
U+200D

Клей в ZWJ-последовательностях эмодзи — эмодзи семьи это четыре эмодзи, склеенные тремя символами U+200D, отрисовываемые как один глиф.

Метка слева направо
U+200E

Принудительно задаёт направление текста слева направо без видимого глифа. Нужна в смешаннонаправленном тексте; злоупотребляется в bidi-подменах.

Метка справа налево
U+200F

Принудительно задаёт направление справа налево. Двойное применение как у U+200E — нужна для иврита и арабского, используется в фишинге.

Мягкий перенос
U+00AD

Невидим, пока строка не разрывается в этой позиции — тогда отрисовывается как дефис. Часто попадает в текст случайно при копировании из PDF.

Почему невидимые символы — настоящая проблема

Невидимые символы Unicode существуют по уважительным причинам — управление переносами, соединение в курсивных письменностях, двунаправленный текст, опциональная расстановка переносов. Но поскольку они не отрисовываются, они же служат инструментом злоупотреблений. Работа Trojan Source (CVE-2021-42574, раскрыто в октябре 2021) показала, что символы двунаправленного переопределения могут заставить исходный код компилироваться не так, как он читается на экране. Сопутствующее раскрытие (CVE-2021-42694) описало атаки гомоглифами, где кириллическая а (U+0430) заменяет латинскую a (U+0061) в имени функции. Ближе к обычному использованию — символы нулевой ширины вставляют в имена пользователей и идентификаторы, чтобы две одинаково читающиеся строки сравнивались как разные. Детектор, показывающий эти символы по коду, — самый быстрый способ их найти, потому что глазом их не различить.

Для чего это полезно

Очистка скопированного текста
Текст, вставленный с сайтов, PDF и документов Word, часто несёт пробелы нулевой ширины и мягкие переносы, ломающие поиск и сравнение. Вставьте его сюда, удалите их, скопируйте чистый текст обратно.
Проверка имён и идентификаторов
Два имени, читающихся как «admin», могут быть разными строками, если в одном есть U+200B. Прогоните любой подозрительный идентификатор через детектор, прежде чем доверять сравнению.
Просмотр исходного кода
Символы двунаправленного переопределения (с U+202A по U+202E) могут прятать логику в коде, выглядящем корректно. Вставьте любой фрагмент из ненадёжного источника перед тем, как его читать.
Перехват фишинговых ссылок
Атаки IDN-гомографов используют похожие символы для регистрации обманно похожих доменов. Детектор не распознает домен, но покажет невидимые символы, спрятанные в тексте URL.

Что должна искать серьёзная проверка

Шесть символов выше — самые частые, но это не полная картина. Серьёзная проверка покрывает несколько диапазонов. Форматные символы нулевой ширины с 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, когда она вне первой позиции файла. Учтите, что он помечает невидимые символы по коду; он не обнаруживает гомоглифы — видимые символы, которые просто похожи на другие.

Частые вопросы об обнаружении скрытых символов