Что такое Punycode
Punycode (RFC 3492, 2003) — алгоритм для кодирования любых Unicode-строк в подмножество ASCII. Создан специально для DNS, который изначально работал только с латинскими буквами, цифрами и дефисом. Punycode позволил появиться интернационализированным доменам (IDN) — президент.рф, 日本.jp, café.fr.
Префикс xn-- перед именем сообщает: «дальше Punycode». Полный пример: президент.рф в DNS хранится как xn--d1abbgf6aiiy.xn--p1ai. Браузер автоматически декодирует обратно в кириллицу при отображении в URL bar (если домен безопасный).
Как работает алгоритм
Punycode — это bootstring-кодирование, оптимизированное для коротких строк. Идея:
- Сначала ASCII. Все ASCII-символы из исходной строки выводятся как есть.
- Разделитель. Дефис (-) разделяет ASCII-часть от закодированной non-ASCII.
- Numeric encoding. Non-ASCII символы кодируются последовательностью цифр в base-36, представляющих смещения и порядок вставки в результат.
- Адаптивная компрессия. Чем чаще символ — тем короче его код. Для русских доменов кириллица «компрессируется» эффективнее, чем для смеси языков.
Декодирование — обратный процесс: восстановление позиций символов из последовательности цифр. Алгоритм симметричен, без потерь.
Punycode is an instance of a more general algorithm called Bootstring, which allows strings composed from a small set of "basic" code points to uniquely represent any string of code points drawn from a larger set.— RFC 3492 — A Bootstring Encoding of Unicode for IDN
Когда нужен Punycode
- Регистрация .рф домена. Регистратор требует ввести домен в Punycode — нужен конвертер.
- SMTP / email. Email-серверы могут не поддерживать Unicode в домене — нужен xn-- вариант.
- SSL-сертификаты. Let's Encrypt требует Punycode-форму домена в SAN.
- DNS-хостинг. Cloudflare, Yandex DNS — управление через xn--, но в UI показывают кириллицу.
- WHOIS-запросы. WHOIS-серверы работают с ASCII — нужен Punycode.
- Логирование / аналитика. Часто показывает домены в Punycode — нужен декодер для понимания.
Homograph attacks
Главная проблема IDN — homograph attack. Множество символов в Unicode визуально идентичны латинским:
- Кириллический а (U+0430) ≈ латинский a (U+0061)
- Кириллический о (U+043E) ≈ латинский o (U+006F)
- Кириллический е (U+0435) ≈ латинский e (U+0065)
- Кириллический р (U+0440) ≈ латинский p (U+0070)
Регистрируется домен аpple.com с кириллической «а» (Punycode: xn--pple-43d.com) — визуально неотличим от apple.com. Жертва кликает на ссылку в фишинговом письме, видит «apple.com» в URL bar — и не подозревает подделку.
Защита:
- Браузеры. Chrome, Firefox, Safari показывают Punycode для смешанных скриптов начиная с 2017 (Chrome 58+).
- Регистраторы. Запрещают регистрацию доменов со смешанными скриптами (.рф = только кириллица).
- Whitelists. Корпоративные системы проверяют исходящие письма — если ссылка ведёт на смешанный IDN, флагают.
- Пользователь. Никогда не вводите пароль на странице, открытой по ссылке из письма. Используйте закладки, password manager — он не сработает на homograph-домене.
- RFC 3492 — Punycode: A Bootstring encoding of Unicode for IDN. Adam M. Costello (IETF). datatracker.ietf.org/doc/html/rfc3492. 2003.
- RFC 5891 — IDNA 2008 Protocol. IETF. datatracker.ietf.org/doc/html/rfc5891. 2010.
- IDN Display Algorithm — Chromium. Google Chrome. chromium.org/developers/design-documents/idn-in-google-chrome. 2024.
