Punycode

Punycode — это стандартизированный метод кодирования, который позволяет отображать символы Unicode с помощью ограниченного набора символов ASCII, состоящего только из следующих элементов:

  • Строчные буквы: от a до z
  • Цифры: от 0 до 9
  • Специальные символы: дефис (-)

Перечисленные элементы называются базовыми символами.

Эта процедура в основном используется для обработки интернационализированных доменных имен (IDN), которые содержат небазовые символы в дополнение к базовым.

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

Punycode был стандартизирован в 2003 году рабочей группой по проектированию Интернета (IETF) в качестве синтаксиса для кодирования интернационализированных доменных имен в приложениях (IDNA).

IETF определяет доменные имена как IDN, если они содержат специальные символы, такие как диакритические знаки или символы других алфавитов (например, умляуты в немецком языке), в дополнение к буквам латинского алфавита, и поэтому не могут быть обработаны базовыми протоколами, такими как система доменных имен (DNS).

В качестве примера приведем символы немецкого языка: хотя доменное имя типа müller-büromöbel (офисная мебель Müller) разрешено в домене верхнего уровня .de с момента введения ИДИ, оно может быть обработано только в контексте разрешения имен — путем кодирования небазовых символов. Многие интернет-протоколы основаны на английском письменном языке и поэтому поддерживают только ограниченный набор символов ASCII.

Чтобы обеспечить совместимость между ИДИ и старыми интернет-стандартами, IETF регламентировала кодирование интернационализированных доменных имен с помощью ранее разрешенных символов и поэтому стандартизировала соответствующую процедуру с помощью Punycode.

Примечание

Для адресов электронной почты кодировка Punycode используется только для интернационализированных доменов электронной почты. Локальная часть (до символа @) кодируется через UTF-8, если она содержит символы, не относящиеся к кодировке ASCII.

Как работает кодировка Punycode?

Punycode определен IETF в RFC 3492 как возможное применение общего алгоритма кодирования, известного как загрузочная строка. Алгоритм загрузочной строки позволяет сопоставлять строки символов произвольных наборов символов с ограниченным выбором элементов. Разработка процедуры кодирования основана на шести принципах:

  • Полнота: Каждая выходная строка может быть сопоставлена с упрощенной строкой с помощью загрузочной строки.
  • Уникальность: Присвоение выходной строки соответствующей загрузочной строке кодирования является уникальным. Каждому Punycode может быть присвоен ровно один аналог ASCII и наоборот.
  • Обратимость: Кодирование с помощью загрузочной строки может быть изменено в любое время без потери информации.
  • Эффективность: Кодированная строка — если вообще кодируется — лишь минимально длиннее выходной строки.
  • Простота: Bootstring использует простые алгоритмы кодирования и декодирования.
  • Читабельность: Кодируются только те символы, которые не могут быть представлены в целевом наборе символов. Все остальные символы остаются неизменными.

Punycode определяет строку загрузки в соответствии с требованиями к интернационализированным доменным именам. Это должно позволить отображать символы Unicode через ранее разрешенные базовые символы.

Мы проиллюстрируем кодирование на следующем примере.

ИДИ: müller-büromöbel

ИДИ müller-büromöbel содержит два символа ü и ö, которые не входят в ранее разрешенный набор символов для доменных имен и поэтому должны быть закодированы через Punycode для обеспечения совместимости.

На первом этапе процедура кодирования предусматривает нормализацию выходной строки символов. Все прописные буквы заменяются соответствующими строчными.

На втором этапе удаляются все небазовые символы. Затем они добавляются к доменному имени в закодированном виде и разделяются дефисом.

Если для кодирования интернет-адресов используется синтаксис Punycode, каждая строка результата снабжается так называемым префиксом ACE (сокращение от ASCII-совместимой кодировки):

ACE-префикс: xn--.

Префикс ACE гарантирует, что доменные имена, содержащие дефисы, не будут неправильно интерпретированы как международные доменные имена.

Это приводит к следующей кодировке для ИДИ müller-büromöbel:

ACE: xn--mller-bürombel-rmb4fg

Отклонения возникают, если доменное имя не содержит ни одного небазового символа или содержит только небазовые символы.

В доменном имени, содержащем только небазовые символы, после кодирования отображается только кодированная строка и префикс ACE.

Таким образом, доменное имя типа παράδειγμα (по-гречески «пример») соответствует следующей кодировке:

IDN: παράδειγμα

ACE: xn--hxajbheg2az3al

Если доменное имя содержит только базовые символы, добавляется только префикс ACE и дефис в конце. В этом случае синтаксис Punycode не используется в связи с доменными именами.

Если рассматривать «полное доменное имя» (FQDN) в целом, то каждая метка (домен верхнего уровня, домен второго уровня, домен третьего уровня и т. д.) кодируется отдельно.

Такой домен, как пример.бг (по-болгарски «example.bg»), может быть закодирован следующим образом

IDN: пример.бг

ACE:xn--e1afmkfd.xn--90ae

В следующей таблице представлен обзор различных вариантов синтаксиса Punycode.

  ИДИ Punycode ACE
Базовый & небазовый символ müller-büromöbel.de müller-brombel-rmb4fg.de xn--mller-brombel-rmb4fg.de
Только небазовые символы Παράδειγμα.gr hxajbheg2az3al.gr xn--hxajbheg2az3al.gr
Только базовые символы example.org example.org- Не используется

Алгоритм, лежащий в основе синтаксиса Punycode, гарантирует, что ни одна из доменных меток не превысит максимальную длину в 63 символа, несмотря на преобразование.

Символы Юникода не переводятся один к одному в символы ASCII во время кодирования. Вместо этого алгоритм определяет строку, которая получается из расстояния между стертыми символами и из положения символов в выходной строке.

В приведенном примере символьная строка rmb4fg указывает, что mller-brombel должен быть дополнен символами Юникода ü и ö на втором и седьмом местах.

Примечание

Основной алгоритм Punycode подробно описан в RFC 3492. Кроме того, в этом документе представлена реализация процедуры кодирования на языке программирования C.

При кодировании интернационализированных доменных имен пользователи обычно используют свободно распространяемые конвертеры Punycode.

Бесплатный конвертер Punycode

Бесплатные конвертеры Punycode для перевода ИДИ в ACII-совместимое представление можно найти на различных сайтах.

Мы рекомендуем Punycoder, который конвертирует Punycode в текст/Unicode и наоборот. Этот инструмент использует стандарт IDNA2008, но с обработкой совместимости с Unicode TR#46.

Для преобразования доменных имен хорошим выбором будет конвертер Punycode от Матиаса Байненса, основанный на punycode.js.

Puny-кодирование с доменами emoji

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

Совет

В настоящее время регистрация доменов emoji разрешена в следующих ДВУ: .ws, .tk, .to, .ml, .ga, .cf, .gq и .fm.

Домены Emoji технически обрабатываются как Punycode, но теоретически должны быть представлены пользователю как комбинация текста и смайликов.

Домен Emoji: i❤.ws/

ACE: xn--i-7iq.ws/

В настоящее время практически ни один стандартный браузер не реализует эту функцию. Если вы вводите домен эмодзи в Firefox, Chrome, Safari, Edge или Opera, в адресной строке отображается только строка ACE.

Пуникод как угроза безопасности?

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

Блоггер Xudong Zheng показывает, как выглядит фишинговая атака на примере следующего домена Punycode:

www.xn--80ak6aa92e.com

Это приводит интернет-пользователей на сайт со следующим IDN:

www.аррӏе.com

Указанный URL не является официальным сайтом калифорнийской технологической компании Apple Inc, а представляет собой фишинговый сайт, созданный в демонстрационных целях.

Вместо ASCII-символа а с кодом Unicode U+0061 используется кириллический а (U+0430) — эти два символа трудно различимы невооруженным глазом, но интерпретируются веб-браузерами как разные символы.

Особенно неприятно для пользователей Интернета: даже сертификаты не обеспечивают безопасности. Для современных фишинговых кампаний преступники создают действительные SSL-сертификаты, которые должны сделать их сайты похожими на настоящие.

Современные версии Chrome и Opera предотвращают подобные фишинговые атаки, отображая строку ACE вместо интернационализированного домена на IDN, в которых смешаны символы из разных наборов символов. Internet Explorer и Microsoft Edge полностью предотвращают доступ к подобным доменам. Только Firefox не предлагает никакой защиты от фишинга Punycode.

Вот как пользователи Firefox могут защитить себя: Чтобы снизить риск, который представляют собой фишинговые веб-сайты, пользователи Firefox в настоящее время имеют возможность предотвратить перевод Punycode в ИДИ в целом. Для этого временного решения необходимо выполнить всего два шага:

  1. Зайдите в редактор конфигурации: Введите about:config в адресной строке веб-браузера, чтобы открыть редактор конфигурации Firefox.
  2. Принудительно включите Punycode: Найдите параметр network.IDN_show_punycode и измените его значение с false на true.

После настройки Firefox будет отображать интернационализированные домены в адресной строке как строки ACE.

Оцените статью
cdelat.ru
Добавить комментарий