Обработка международных доменных имен (IDN)

В этом разделе описывается, как работать с международными доменными именами (IDN) в приложениях. Идентификаторы идентификаторов задаются группой рабочей сети RFC 3490: интернационализация доменных имен в приложениях (IDNA). До этого проекта идентификаторы IDN были ограничены латинскими символами без диакритических символов. IDNA позволяет идентификаторам IDN включать латинские символы с диакритичными символами, а также символами из скриптов, отличных от латиниц, таких как кириллица, арабский и китайский. Стандарт также устанавливает правила сопоставления идентификаторов IDN с именами доменов, доступных только для ASCII. Таким образом, проблемы IDNA можно обрабатывать на стороне клиента, не требуя изменений сервера доменных имен (DNS).

Внимание

RFC 3490 представляет ряд проблем безопасности, связанных с использованием идентификаторов IDN. Дополнительные сведения см. в разделе "Вопросы безопасности: международные функции".

 

Примечание.

IdNA в настоящее время основана на Юникоде 3.2.

 

Функции API NLS для обработки идентификаторов

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

  • IdnToAscii. Преобразует идентификатор в Punycode.
  • IdnToNameprepUnicode. Выполняет часть NamePrep преобразования идентификатора в имя 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 играют аналогичную роль функций, перечисленных выше в устранении рисков безопасности. Скачивание API устранения рисков с помощью Microsoft Internationalized Domain Name (IDN) доступно из archive.org.

Обработка строк Юникода

IDNA поддерживает преобразование строк Юникода в допустимые метки имен узла, за исключением строк, содержащих определенные запрещенные символы, такие как символы управления, символы из области частного использования (PUA) и подобные. Приложение может использовать флаг IDN_USE_STD3_ASCII_RULES с несколькими функциями преобразования NLS для принудительного сбоя функций, если они сталкиваются с символами ASCII, отличными от букв, цифр или символа дефиса минус (-), или если строка начинается или заканчивается символом дефиса-минуса. Эти символы всегда запрещаются использовать в доменных именах и остаются запрещенными в проекте стандарта.

Обработка неназначенных точек кода

Идентификаторы не могут содержать неназначенные кодовые точки. Таким образом, кодовые точки, не связанные с символом ("назначенным") в Юникоде 3.2, не имеют определенных сопоставлений ИДЕНТИФИКАТОРОВ, даже если флаг IDN_ALLOW_UNASSIGNED в некоторых функциях преобразования позволяет сопоставлять их с Punycode. Список неназначенных точек кода можно найти в RFC 3454.

Внимание

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

 

Неназначенные точки кода не допускаются в хранимых строках, используемых в идентификаторах протокола и именованных сущностях, таких как имена в цифровых сертификатах и частях доменных имен DNS. Однако кодовые точки допускаются в строках запроса, например имена, введенные пользователем для цифровых центров сертификации и подстановок DNS, которые используются для сопоставления с хранимыми идентификаторами.

Внимание

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

 

Преобразование доменных имен в имена ASCII

Приложение может использовать функцию IdnToAscii и некоторые функции устранения рисков для преобразования идентификаторов IDN в ASCII.

Внимание

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

 

Примеры

NLS: пример преобразования международного доменного имени (IDN) демонстрирует использование функций преобразования IDN. NLS: пример устранения рисков с международным доменным именем (IDN) демонстрирует использование функций устранения рисков idN.

Использование поддержки национального языка

Вопросы безопасности: международные функции