Gestion des noms de domaines internationaux (IDN)

Cette rubrique explique comment utiliser des noms de domaines internationaux (IDN) dans vos applications. Les IDN sont spécifiés par le groupe de travail réseau RFC 3490 : internationalisation des noms de domaines dans les applications (IDNA). Avant cette norme provisoire, les IDN étaient limités aux caractères latins sans signes diacritiques. L’IDNA permet aux IDN d’inclure des caractères latins avec des signes diacritiques, ainsi que des caractères provenant de scripts non latins, tels que cyrillique, arabe et chinois. La norme établit également des règles pour le mappage des IDN aux noms de domaines ASCII uniquement. Par conséquent, les problèmes IDNA peuvent être gérés côté client, sans nécessiter de modifications de serveur de noms de domaine (DNS).

Attention

RFC 3490 introduit un certain nombre de problèmes de sécurité liés à l’utilisation des IDN. Pour plus d’informations, consultez la section Considérations relatives à la sécurité : fonctionnalités internationales.

 

Remarque

L’IDNA est actuellement basé sur Unicode 3.2.

 

Fonctions d’API NLS pour la gestion des IDN

NLS inclut les fonctions de conversion suivantes que votre application peut utiliser pour convertir un IDN en différentes représentations. Pour obtenir un exemple d’utilisation de ces fonctions, consultez NLS : exemple de conversion de nom de domaine international (IDN).

  • IdnToAscii. Convertit un IDN en Punycode.
  • IdnToNameprepUnicode. Effectue la partie NamePrep de la conversion d’un IDN en nom ASCII. Cette fonction crée une représentation Unicode canonique d’une chaîne.
  • IdnToUnicode. Convertit une chaîne Punycode en chaîne UTF-16 normale.

NLS définit également plusieurs fonctions API qui peuvent être utilisées pour atténuer certains des risques de sécurité présentés par la technologie IDN. Sur Windows Vista et versions ultérieures, les fonctions suivantes permettent de vérifier que les caractères d’un IDN donné sont entièrement tirés des scripts associés à des paramètres régionaux spécifiques. Pour obtenir un exemple d’utilisation de ces fonctions, consultez NLS : exemple d’atténuation de nom de domaine international (IDN).

Pour les applications qui s’exécutent sur Windows XP et Windows Server 2003, les fonctions DownlevelGetLocaleScripts, DownlevelGetStringScripts et DownlevelVerifyScripts jouent un rôle similaire aux fonctions répertoriées ci-dessus pour atténuer les risques de sécurité. Le téléchargement des « API d’atténuation du nom de domaine international (IDN) Microsoft » est disponible à partir de archive.org.

Gérer les chaînes Unicode

L’IDNA prend en charge la transformation de chaînes Unicode en étiquettes de nom d’hôte légitimes, à l’exception de chaînes contenant certains caractères interdits, tels que les caractères de contrôle, les caractères de la zone d’utilisation privée (PUA) et d’autres du même type. Votre application peut utiliser l’indicateur IDN_USE_STD3_ASCII_RULES avec plusieurs fonctions de conversion NLS pour forcer l’échec des fonctions s’ils rencontrent des caractères ASCII autres que des lettres, des chiffres ou du caractère de tiret-moins (-), ou si une chaîne commence ou se termine par le caractère tiret-moins. L’utilisation de ces caractères a toujours été interdite dans les noms de domaine et restent interdits dans la norme provisoire.

Gérer les points de code non attribués

Les IDN ne peuvent pas contenir de points de code non attribués. Par conséquent, les points de code qui ne sont pas associés à un caractère (« attribué ») à partir d’Unicode 3.2 n’ont pas de mappages IDN définis, même si l’indicateur IDN_ALLOW_UNASSIGNED dans certaines fonctions de conversion leur permet d’être mappés à Punycode. Vous trouverez la liste des points de code non attribués dans RFC 3454.

Attention

Si votre application encode des points de code non attribués en tant que Punycode, les noms de domaines résultants doivent être incorrects. La sécurité peut être compromise si une version ultérieure de l’IDNA rend ces noms légaux ou si l’application filtre les caractères non autorisés pour essayer de créer un nom de domaine légal.

 

Les points de code non attribués ne sont pas autorisés dans les chaînes stockées utilisées dans les identificateurs de protocole et les entités nommées, telles que les noms dans les certificats numériques et les parties de noms de domaine DNS. Toutefois, les points de code sont autorisés dans les chaînes de requête. Par exemple, les noms entrés par l’utilisateur pour les autorités de certification numériques et les recherches DNS, qui sont utilisés pour correspondre aux identificateurs stockés.

Attention

Bien que les chaînes de requête puissent utiliser des points de code non attribués, vous ne devez pas les utiliser dans vos applications. Même une chaîne de requête fournie par l’utilisateur présente un risque d’attaque d’usurpation d’identité. Dans ce type d’attaque, le site hôte sans scrupule redirige les utilisateurs du site qu’ils ont l’intention de consulter vers un autre site qui peut fournir des informations sensibles à un tiers. Par exemple, la copie d’une chaîne à partir d’un e-mail entrant peut présenter les mêmes risques que de cliquer sur un lien dans un navigateur.

 

Convertir des noms de domaine en noms ASCII

Votre application peut utiliser la fonction IdnToAscii et certaines fonctions d’atténuation pour convertir des IDN en ASCII.

Attention

Étant donné que les chaînes avec des représentations binaires très différentes peuvent être considérées identiques, cette fonction peut entraîner certaines préoccupations de sécurité. Pour plus d’informations, consultez la discussion sur les fonctions de comparaison dans Considérations relatives à la sécurité : fonctionnalités internationales.

 

Exemples

NLS : exemple de conversion de nom de domaine international (IDN) illustre l’utilisation des fonctions de conversion IDN. NLS : exemple d’atténuation de nom de domaine international (IDN) illustre l’utilisation des fonctions d’atténuation IDN.

Utilisation de la prise en charge de la langue nationale

Considérations relatives à la sécurité : fonctionnalités internationales