Проверка IDN-гомографов

Два имени могут писаться разными символами и при этом читаться одинаково. apple.com и аpple.com — где первая буква является кириллической строчной а — для сети это разные имена, а для читателя одно и то же слово. Эта страница разбирает имя и говорит, к какому из этих случаев оно относится: делит имя на метки, декодирует каждую метку xn-- обратно в символы, которые она содержит, подсчитывает байты относительно ограничений DNS, называет каждый похожий символ вместе с заимствуемым алфавитом и сворачивает всё имя к виду, который оно имитирует. Страница сообщает, что нашла и что не нашла, с одинаковой подробностью, поэтому чистый ответ означает, что проверки прошли, а не что ничего не проверяли.
Вся обработка выполняется локально в вашем браузере — введённое имя никуда не загружается и не разрешается.

Впервые с этим сталкиваетесь? IDN-гомографы простым языком — что делает punycode и чего он не делает, почему браузер иногда показывает xn-- и почему эта страница — набор проверок, а не вердикт.
Читать ввод как: Сначала привести имя к NFC
ЧИТАЕТСЯ КАК —
ФОРМА DNS (что получает резолвер) —
РАЗМЕР —
Пока ничего не проверено. Введите или вставьте имя выше — по одному имени за раз — или нажмите Загрузить пример. Страница принимает голое имя, имя, вырезанное из URL, или полный URL, и сообщает, какой вариант она взяла. Каждая выполненная проверка перечислена под результатом, включая те, что ничего не нашли.
Что такое IDN-гомограф?
Гомограф — это слово, записанное одним способом и читаемое иначе. В доменном имени для этого обычно достаточно одного символа: apple.com — это семь латинских букв, а аpple.com начинается с U+0430, кириллической строчной буквы а, которая в любом вашем шрифте начертана так же. Для сети это два разных имени. Для вашего глаза — одно и то же слово, и только одно из них принадлежит Apple.

Первые два десятилетия DNS имена состояли только из ASCII, поэтому всё, что с ними связано, измеряется в байтах и буквах: метки из букв, цифр и дефисов, не более 63 байт каждая и не более 255 байт в сумме. Интернационализированное доменное имя (IDN) появляется тогда, когда правила открывают для остального Unicode, а punycode (RFC 3492) — это правило записи, которое сохраняет работу старой системы: метка, содержащая что-либо за пределами ASCII, записывается как метка xn--, то есть ASCII-строка, которая несёт те же символы в свёрнутом виде. 中文.com передаётся как xn--fiq228c.com, и обе записи обозначают один и тот же хост.

Важно здесь то, чего punycode не делает. Он преобразует только запись и ничего больше. Он не решает, стоит ли разрешать аpple.com рядом с apple.com, и спросить его об этом невозможно, потому что этот вопрос касается глаз и шрифтов, а не байтов. Реестр решает, какие символы он будет продавать, браузер решает, как отображать имя, которое он считает безопасным, а читатель решает, нажимать ли на ссылку. Эта страница отвечает на вопрос, лежащий в основе всех трёх: из каких символов на самом деле состоит это имя и что оно за счёт этого пишет?

Случаи, по которым проверяется эта страница

Каждую строку ниже страница запускает при загрузке и повторно по кнопке Самопроверка, и страница должна сообщать ровно то, что написано в строке: те же находки, тот же уровень, та же форма DNS, то же количество байт, ни больше ни меньше. Именно поэтому чистый ответ здесь чего-то стоит: путь кода, который пропускает обычное имя, тот же, что ловит приведённые ниже трюки.

Что за случай Уровень Имя, как оно поступает Что страница должна сообщить

Как страница принимает решение
  1. Выделите имя из того, что вы вставили. Голое имя используется как есть; из URL вырезается хост, а схема, порт, путь и запрос отбрасываются. Страница сообщает, что она сделала, а не молча разбирает косую черту так, будто это часть имени.
  2. Очистите его так, как сделал бы клиент. Управляющие символы, символы нулевой ширины и метка порядка байтов удаляются; полноширинная или идеографическая точка считается точкой; завершающая точка означает корень, а не ошибку. Каждый символ, удалённый или переинтерпретированный таким образом, сообщается, потому что тихо отброшенный пробел нулевой ширины — именно то, о чём вам нужно знать.
  3. Разбейте имя на метки и измерьте каждую. Метка не может быть пустой, не может начинаться или заканчиваться дефисом и не может содержать два дефиса на позициях три и четыре, если только это не метка xn--. Каждая метка измеряется в байтах UTF-8 относительно предела 63 байта, а всё имя — относительно 255.
  4. Декодируйте каждую метку xn-- обратно в символы. Декодированная метка затем кодируется повторно и сравнивается с тем, что вы ввели. Метка, которая не проходит этот круговой путь, не является той меткой, за которую себя выдаёт, а метка, декодирующаяся в управляющий символ или в пустоту, сообщается как таковая, а не молча отбрасывается.
  5. Спросите, что это за каждый символ. Его кодовая точка, его байты UTF-8, алфавит, которому он принадлежит, входит ли он в группу символов, начертание которых одинаково, и каковы другие члены этой группы. Здесь кириллическая а перестаёт быть «буквой» и становится «буквой, похожей на латинскую».
  6. Сверните имя к начертанию, которое оно имитирует. Каждый похожий символ заменяется символом, на который он похож, — так аpple.com превращается в apple.com. Это свёрнутое прочтение — самая полезная строка страницы, потому что apple.com — это то, с чем можно что-то сделать, а «кириллическая а» — нет.
  7. Соберите находки и сообщите о худшей. Каждая находка сообщается один раз вместе с метками, в которых она встречается. Имя, которое лишь выглядит необычно, даёт примечания, а не находки: смешение кандзи и каны или завершающая корневая точка — обычное письмо, а не повод для беспокойства.

Уровни и то, что они утверждают

нет здесь не нашлось ничего, стоящего упоминания — низкий то же имя, написанное вторым способом — средний символ, который DNS не пропустит, или символ, который сворачивается к простой букве — высокий имя, построенное так, чтобы читаться как другое имя, или имя, которое вовсе нельзя отправить.

Уровень — это худшее, что могут означать находки, а не вероятность и не суждение о сайте. Совершенно честное имя может получить средний уровень, если содержит один символ вне алфавита имени хоста, а злонамеренное — высокий даже без чего-либо сложнее кириллической буквы. Список под уровнем объясняет почему, по одной строке на находку, и именно этот список стоит читать.

Проверки, которые выполняются, одна за другой

Таблица ниже построена из того же списка, из которого страница формирует отчёт, поэтому строка здесь и находка в результате не могут расходиться. Проверка, которая ничего не нашла, помечена как нет: смысл таблицы в том, чтобы вы видели, что вопрос задан и на него ответили, а не гадали, задавался ли он вообще.

Проверка Худшее, что может значить Что она ищет

Тот же список управляет примечаниями, которые уровня не несут вовсе: метка без точки, завершающая корневая точка, домен верхнего уровня не из ASCII, разделитель, отличный от точки, имя в верхнем регистре, символы, удалённые при очистке, и URL, сведённый к хосту.

Ограничения, которые соблюдает DNS

Имя — это список меток, и каждая из них измеряется в байтах, а не в символах. Именно это различие и объясняет существование punycode: 中文 — это два символа и шесть байт, а его форма xn-- — пятнадцать символов, поэтому должна помещаться закодированная запись. Страница применяет оба предела и сообщает, какой из них вы превысили.

Предел Значение Что происходит на границе
Почему браузер иногда показывает xn--

Возможно, вы замечали, что имя, записанное по-китайски или кириллицей, иногда появляется в адресной строке как абракадабра xn-- вместо тех символов, которых вы ожидаете. Это браузер отказывается показывать красивую форму, а не сайт не регистрирует её. Браузер применяет собственное правило к имени, которое он ещё не видел, и это правило существует по той же причине, по которой существует вся эта страница: показ аpple.com как аpple.com — именно то, чего хочет злоумышленник, поэтому незнакомое смешанное имя показывается в закодированной записи, пока его не увидят достаточно часто, чтобы ему доверять.

Где появляется имя Что показывается Почему

Чего не делает эта страница
Это набор проверок, а не вердикт и не чёрный список. Страница сообщает, из чего состоит имя; она понятия не имеет, что делает сайт. Имя может пройти все проверки здесь и всё же быть фишинговой страницей, а имя может быть помечено как имя смешанного алфавита и при этом оказаться обычным сайтом владельца, который пишет на своём языке. Группы начертаний — написанное вручную подмножество конфузаблов из UTS #39, поэтому пару символов, которую эта страница не знает, она не сообщит. И ничего здесь не разрешается, не загружается и не ищется: введённое имя никогда не покидает браузер, а значит, страница не может знать, существует ли имя.
Откуда берутся правила

Punycode — это RFC 3492, и самопроверка на этой странице первой проверкой прогоняет одиннадцать примеров меток, приведённых в этом документе, так что кодировщик здесь проверяется по примерам из стандарта, а не сам по себе. Правила обработки, через которые проходит IDN, — это RFC 5891 с таблицами символов RFC 5892, а слой совместимости, который реально применяют браузеры, — UTS #46 с флагом non-transitional; эта страница сообщает, что делают эти правила, а не делает вид, будто реализует их. Свёртка, которую она применяет, — NFC, затем нижний регистр, затем RFC 3492 — это та же короткая последовательность, которую клиент выполняет перед отправкой имени. Группы начертаний, диапазоны алфавитов и таблицы невидимых символов в этом семействе страниц написаны вручную для этого семейства: стандарты названы, чтобы вы могли прочитать их сами, и никакой текст из них здесь не воспроизводится.

Вопросы

Всегда ли имя смешанного алфавита — это атака?

Нет, и считать так было бы ошибкой, которая важна. Японский пишет кандзи и каной в одном слове, а корейский пишет ханча внутри хангыля. Необычного объяснения не имеет только смешение латиницы с кириллицей или греческим в одной метке, потому что эти алфавиты не используются вместе ни в одном языке, и страница проводит черту именно там, а не помечает каждое смешение. Поэтому строки японского и корейского в таблице случаев выше возвращаются чистыми.

Тогда почему моё собственное имя получает средний уровень?

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

Говорит ли страница, опасно ли имя, зарегистрировано ли оно или доступно?

Нет, ни по одному из трёх пунктов. Она никогда не обращается к сети и ничего не разрешает, поэтому не может знать, существует ли имя или кому оно принадлежит, и намеренно ничего не говорит о том, что делает сайт. Она отвечает на более узкий вопрос, который вы можете проверить сами: из каких символов состоит это имя и, если свернуть похожие символы к буквам, которые они имитируют, что оно пишет?

Моё имя записано по-китайски, и страница говорит, что домен верхнего уровня не из ASCII. Что-то не так?

Ничего страшного. Китайский домен верхнего уровня передаётся как собственная метка xn--, поэтому последняя метка имени записана в закодированной форме, и страница это отмечает. Примечания не несут уровня, потому что описывают факт, а не проблему.

Почему строка «читается как» иногда показывает то же имя, которое я ввёл?

Потому что страница показывает свёрнутое прочтение только тогда, когда свёртка действительно что-то меняет. Если каждый символ имени уже является начертанием, которое он имитирует, свёрнутое прочтение и имя — одна и та же строка, и сообщать вам нечего.

Что такое A-метка и U-метка?

A-метка — это ASCII-запись, которая передаётся: xn--fiq228c. U-метка — та же метка, записанная алфавитом, которому она принадлежит: 中文. Это две записи одной метки, и страница показывает обе для каждой декодированной метки, чтобы вы видели, что скрывает закодированная метка.