Обработка международных доменных имен (IDN)
В этом разделе описывается, как работать с международными доменными именами (IDN) в приложениях. Интернационализированные доменные имена задаются группой сетевой работы RFC 3490: Интернационализация доменных имен в приложениях (IDNA). До этого проекта идентификаторы IDN были ограничены латинскими символами без диакритических символов. IDNA позволяет идентификаторам IDN включать латинские символы с диакритическими знаками, а также символы из алфавитов, не относящихся к латинице, таких как кириллица, арабский и китайский. Стандарт также устанавливает правила сопоставления международных доменных имен (IDN) с доменными именами, содержащими только символы ASCII. Таким образом, проблемы IDNA можно обрабатывать на стороне клиента, не требуя изменений сервера доменных имен (DNS).
Осторожность
RFC 3490 представляет ряд проблем безопасности, связанных с использованием идентификаторов IDN. Дополнительные сведения см. в соответствующем разделе вопросы безопасности: международные функции.
Заметка
IdNA в настоящее время основана на Юникоде 3.2.
Функции API NLS для обработки IDN (интернационализированных доменных имён)
NLS включает следующие функции преобразования, которые приложение может использовать для преобразования IDN (интернационализированного доменного имени) в различные представления. Пример использования этих функций см. в разделе NLS: пример преобразования международного доменного имени (IDN).
- IdnToAscii. Преобразует международное доменное имя в Punycode.
- IdnToNameprepUnicode. Выполняет часть NamePrep, относящуюся к преобразованию интернационализированного доменного имени (IDN) в имя ASCII. Эта функция создает каноническое представление строки в Юникоде.
- IdnToUnicode. Преобразует строку Punycode в обычную строку UTF-16.
NLS также определяет несколько функций API, которые можно использовать для устранения некоторых рисков безопасности, представленных технологией IDN. В Windows Vista и более поздних версиях следующие функции используются для проверки того, что символы в заданном идентификаторе полностью извлекаются из алфавитов, связанных с определенной локалью или локалями. Пример использования этих функций см. в NLS: Образец снижения рисков при работе с международным доменным именем (IDN).
- GetStringScripts. Предоставляет список сценариев, используемых в определенной строке.
- GetLocaleInfo, GetLocaleInfoEx. Получение информации о локализации. При использовании функций, когда LCType задано значение LOCALE_SSCRIPTS, предоставляется список сценариев, обычно используемых для определенного языкового стандарта.
- VerifyScripts. Сравнивает списки скриптов. Чтобы проверить соответствие нескольким языковым стандартам, приложение может совершить несколько вызовов GetLocaleInfo или GetLocaleInfoEx и VerifyScripts.
Для приложений, работающих в Windows XP и Windows Server 2003, функции DownlevelGetLocaleScripts, DownlevelGetStringScriptsи DownlevelVerifyScripts играют аналогичную роль функций, перечисленных выше в устранении рисков безопасности. Скачать из archive.org "API Майкрософт для снижения угроз международным доменным именам (IDN)".
Обработка строк Юникода
IDNA поддерживает преобразование строк Юникода в допустимые метки имен узла, за исключением строк, содержащих определенные запрещенные символы, такие как символы управления, символы из области частного использования (PUA) и подобные. Приложение может использовать флаг IDN_USE_STD3_ASCII_RULES с несколькими функциями преобразования NLS для принудительного сбоя функций, если они сталкиваются с символами ASCII, отличными от букв, цифр или символа дефиса минус (-), или если строка начинается или заканчивается символом дефиса-минуса. Эти символы всегда запрещаются использовать в доменных именах и остаются запрещенными в проекте стандарта.
Обработка неназначенных кодовых точек
Международные доменные имена не могут содержать неприсвоенные кодовые точки. Таким образом, кодовые точки, не связанные с каким-либо символом ("присвоенным") в Юникоде 3.2, не имеют определённых сопоставлений IDN, даже если флаг IDN_ALLOW_UNASSIGNED в некоторых функциях преобразования допускает их сопоставление с Punycode. Список неназначенных точек кода можно найти в RFC 3454.
Осторожность
Если приложение кодирует неназначенные кодовые точки как Punycode, полученные доменные имена должны быть незаконными. Безопасность может быть скомпрометирована, если более поздняя версия IDNA делает эти имена законными или если приложение фильтрует незаконные символы, чтобы попытаться создать юридическое доменное имя.
Неназначенные точки кода не допускаются в хранимых строках, используемых в идентификаторах протокола и именованных сущностях, таких как имена в цифровых сертификатах и частях доменных имен DNS. Однако кодовые точки допускаются в строках запроса, например имена, введенные пользователем для цифровых центров сертификации и подстановок DNS, которые используются для сопоставления с хранимыми идентификаторами.
Осторожность
Хотя строки запроса могут использовать неназначенные точки кода, их нельзя использовать в приложениях. Даже строка запроса, предоставленная пользователем, представляет риск атаки спуфинга. В этом типе атаки недобросовестный хост-сайт перенаправляет пользователей с сайта, который они намерены посетить, на другой сайт, который может в конечном итоге предоставить конфиденциальную информацию третьей стороне. Например, копирование строки из входящей электронной почты может представлять те же риски, что и при нажатии ссылки в браузере.
Преобразование доменных имен в имена ASCII
Приложение может использовать функцию IdnToAscii и определённые функции смягчения последствий для преобразования идентификаторов IDN в ASCII.
Осторожность
Так как строки с очень разными двоичными представлениями могут сравниться как идентичные, эта функция может вызвать определенные проблемы безопасности. Дополнительные сведения см. в обсуждении функций сравнения в вопросы безопасности: международные функции.
Примеры
NLS: пример преобразования международного доменного имени (IDN) демонстрирует использование функций преобразования IDN. NLS: Образец снижения рисков для международного доменного имени (IDN) демонстрирует использование функций IDN для снижения рисков.
Связанные разделы