Пуникоды объяснил

Пуникоды объяснил

Исходный узел: 1903509

Если вы ограничены ASCII, как вы сможете представлять более сложные вещи, такие как смайлы или нелатинские символы? Одним из ответов является Punycode, способ представления символов Юникода в ASCII. Однако, хотя технически вы можете закодировать необработанные биты Юникода в символы, например Base64, есть загвоздка. Система доменных имен (DNS) обычно требует, чтобы имена хостов не были чувствительны к регистру, поэтому, вводите ли вы HACKADAY.com, HackADay.com или просто hackaday.com, все это идет в одно и то же место.

[А. Костелло] в Калифорнийском университете Беркли предложил идею Punycode в RFC 3492 в марте 2003 года. В нем описан простой алгоритм, в котором все обычные символы ASCII извлекаются и закрепляются с одной стороны с разделителем между ними, в данном случае дефисом. Затем символы Юникода кодируются и закрепляются в конце строки.

Сначала числовой код и позиция в строке умножаются. Затем число кодируется как База-36 (a-z и 0-9) целое число переменной длины. Например, приветствие и греческое слово «спасибо»: «Эй, ευχαριστώ” становится «Привет, -mxahn5algcq2″. Точно так же прекрасный город München становится мнчен-3я.

Как вы могли заметить в примере с греческим языком, нет ничего, что могло бы помочь декодеру узнать, какие символы в базе 36 принадлежат какому исходному символу Юникода. Благодаря целым числам переменной длины каждая значащая цифра распознается, поскольку существуют пороговые значения того, какие числа могут быть закодированы. На помощь приходит конечный автомат. RFC дает пример псевдокода, описывающего алгоритм. Это довольно умно: использовать смещение, которое меняется по мере продвижения декодирования. Поскольку она всегда возрастает, это монотонная функция с некоторыми хитрыми свойствами.

Конечно, чтобы обычные URL-адреса не интерпретировались как Punycode, URL-адреса имеют специальный небольшой префикс. хн-- чтобы сообщить браузеру, что это код. Сюда входят все символы Юникода, поэтому смайлы также допустимы. Так почему ты не можешь пойти в xn--mnchen-3ya.de? Если вы введете его в браузер или щелкните ссылку, вы можете увидеть, как ваш браузер преобразует этот запутанный буквенный суп в красивый URL-адрес (не все браузеры делают это). Самая большая проблема — это сам Unicode.

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

Например, можете ли вы отличить эти два домена?

hackaday.com

hackаday.com

Некоторые браузеры отображают текст при наведении как Punycode, а некоторые сохраняют его как эквивалент UTF-8. Буква «а» (U+0061) была заменена кириллической буквой «а» (U+0430), которую большинство компьютеров отображают точно таким же символом.

Это Атака на омографы IDN, где они полагаются на то, что пользователь нажмет на ссылку, между которой он не может отличить. В 2001 году два исследователя безопасности опубликовали статью на эту тему, зарегистрировав «microsoft.com» с кириллическими символами в качестве доказательства концепции. В ответ доменам верхнего уровня было рекомендовано принимать только символы Юникода, содержащие латинские символы, а также символы языков, используемых в этой стране. В результате многие из распространенных доменов верхнего уровня в США вообще не принимают доменные имена Unicode. По крайней мере, неотображаемые символы специально объединены ICANN, что позволяет избежать большой банки с червями, но наличие визуально идентичных, но разных побитовых символов приводит к путанице.

Однако меры по смягчению последствий этих типов атак постепенно внедряются. В качестве первого уровня защиты браузеры Firefox и Chromium отображают версию без Punycode только в том случае, если все символы принадлежат одному и тому же языку. Некоторые браузеры преобразуют все URL-адреса Unicode в Punycode. Другие методы используют оптическое распознавание символов (OCR), чтобы определить, можно ли интерпретировать URL-адрес по-другому. За пределами браузера ссылки, отправленные в текстовых сообщениях или по электронной почте, могут не иметь такого же функционала, и вы не узнаете об этом, пока не откроете их в своем браузере. А потом уже слишком поздно.

Если оставить в стороне проблемы, смогут ли Punycodes провести время под солнцем? Появится ли когда-нибудь у Hackaday ☠️📅.com? Кто знает. Но тем временем мы можем насладиться умным решением, предложенным в 2003 году, сложной проблемы интернационализации доменных имен, которую мы до сих пор не решили.

Отметка времени:

Больше от Взломать день