Punycode
Punycode est une méthode d’encodage standardisée qui permet de mapper les caractères Unicode à l’aide d’un jeu de caractères ASCII limité, qui se compose uniquement des éléments suivants :
- Lettres minuscules : de a à z ;
- Chiffres : de 0 à 9 ;
- Caractères spéciaux : trait d’union (-) ;
Les éléments énumérés sont désignés sous le nom de caractères de base.
La procédure est principalement utilisée pour le traitement du nom de domaine internationalisé (IDN) qui contient également des caractères qui ne sont pas des caractères de base (des caractères spéciaux), en sus des caractères de base.
Développement de la méthode de codage
Punycode a été normalisé en 2003 par l’Internet Engineering Task Force (IETF) en tant que syntaxe pour le codage des noms de domaine internationalisés dans les applications (IDNA).
L’IETF utilise le terme IDN pour décrire les noms de domaine qui, en plus des lettres de l’alphabet latin, contiennent des caractères spéciaux tels que des trémas, des signes diacritiques ou des caractères d'autres alphabets et ne peuvent donc pas être traités par des protocoles de base tels que le Domain Name System (DNS).
Bien qu’un nom de domaine comme Hôtel Château-Lucé soit autorisé sous le domaine de premier niveau .fr depuis l’introduction des IDN, il ne peut être traité - par exemple dans le cadre de la résolution de noms – qu’en codant les caractères qui ne sont pas des caractères de base. Il en va de même en allemand avec le Umlaut comme dans le nom de magasin de meuble müller-büromöbel. De nombreux protocoles sous-jacents à Internet sont basés sur la langue écrite anglaise et ne prennent donc en charge que le jeu de caractères limité ASCII.
Afin d’assurer la compatibilité entre les IDN et les normes Internet plus anciennes, l’IETF a prescrit le codage des noms de domaine internationalisés avec les caractères précédemment autorisés et a normalisé une procédure correspondante avec Punycode.
Pour les adresses email, le Punycode n’est utilisé que pour les domaines email internationalisés. La partie locale (avant le caractère @) est encodée via UTF-8 si elle contient des caractères non-ASCII.
Comment fonctionne le codage avec Punycode ?
Punycode est défini par l‘IETF dans la RFC 3492 comme une application possible d’un algorithme de codage général appelé Bootstring (chaîne de démarrage). L’algorithme de bootstring permet aux chaînes de caractères arbitraires d’être mappées de façon unique avec une sélection limitée d’éléments. Le développement de la méthode de codage repose sur six principes :
- Complétude : chaque chaîne de caractères peut être liée à une chaîne simplifiée à l’aide de bootstring.
- Unicité : l’attribution de la chaîne de caractères au codage bootstrip correspondant est unique. Il est possible d’attribuer exactement à chaque Punycode une équivalence ASCII et inversement.
- Réversibilité : le codage par bootstring peut être inversé à tout moment sans perte d’information.
- Efficacité : la chaîne encodée n’est, le cas échéant, que très peu plus longue que la chaîne initiale.
- Simplicité : Bootstring utilise des algorithmes de codage et de décodage simples.
- Lisibilité : sont codés uniquement les caractères qui ne peuvent pas être représentés dans le jeu de caractères cible. Tous les autres caractères restent inchangés.
Punycode spécifie le bootstring selon les exigences des noms de domaine internationalisés. Cela devrait permettre de représenter les caractères Unicode par rapport aux caractères de base précédemment autorisés.
Nous illustrons le codage avec l’exemple suivant :
IDN : Château-Lucé
L’IDN Château-Lucé contient un caractère â et un é, qui ne sont pas inclus dans le jeu de caractères du nom de domaine précédemment autorisé et doivent donc être encodés en utilisant un code Punycode pour pouvoir assurer la compatibilité.
Dans la première étape, la procédure de codage prévoit une normalisation de la chaîne de caractères de sortie. Toutes les lettres majuscules sont remplacées par des lettres minuscules
Dans la deuxième étape, tous les caractères qui ne sont pas de base sont remplacés. Ceux-ci sont ensuite ajoutés au nom de domaine sous forme codée et séparés par un trait d’union.
Si la méthode punycode est utilisée pour encoder les adresses Internet, chaque chaîne de résultat est pourvue d’un préfixe ACE (abréviation pour ASCII Compatible Encoding) :
Préfixe ACE : xn--
Le préfixe ACE garantit que les noms de domaine contenant des tirets ne sont pas interprétés à tort comme des noms de domaine internationaux.
Pour Château-Lucé, il en résulte le codage suivant :
ACE : xn--chteau-luc-44a6g
Des écarts par rapport à ce schéma se produisent si le nom de domaine ne contient pas ou alors uniquement des caractères de base.
Un nom de domaine qui ne contient que des caractères spéciaux n’affiche que la chaîne codée et le préfixe ACE après codage.
Un domaine comme παράδειγμα (Grec pour exemple) correspond au codage suivant :
IDN: παράδειγμα
ACE: xn--hxajbheg2az3al
Si un nom de domaine ne contient que des caractères de base, seuls le préfixe ACE et un tiret à la fin seront ajoutés. En ce qui concerne les noms de domaine, la méthode du punycode n’est pas utilisée dans ce cas.
Si l’on considère le Fully Qualified Domain Name (FQDN) dans son ensemble, chaque étiquette (domaine de premier niveau, domaine de deuxième niveau, domaine de troisième niveau, etc.) est codée séparément.
Un domaine comme пример.бг (Bulgare pour exemple.bg) pourrait être encodé comme suit
IDN: пример.бг
ACE: xn--e1afmkfd.xn--90ae
Le tableau suivant donne un aperçu des différentes variantes de la procédure Punycode.
IDN | Punycode | ACE | |
---|---|---|---|
Caractères de base et non basiques | Château-Lucé.fr | chteau-luc-44a6g.fr | xn--chteau-luc-44a6g.fr |
Uniquement non basiques | Παράδειγμα.gr | hxajbheg2az3al.gr | xn--hxajbheg2az3al.gr |
Uniquement de base | example.org | example.org- | Pas d‘utilisation |
Il faut remarquer l’algorithme sous-jacent à la méthode punycode, qui garantit qu’aucun des noms de domaine ne dépasse la longueur maximale de 63 caractères malgré la conversion.
Les caractères Unicode ne sont pas convertis en caractères ASCII pendant l'encodage. Au lieu de cela, l’algorithme détermine une chaîne de caractères qui résulte de la distance entre les caractères effacés et de la position des caractères dans la chaîne de sortie.
Dans l’exemple ci-dessus, la chaîne de caractères 44a6g indique que chteau-luc doit être complétée par les caractères Unicode â et é à la troisième et 11ème positions.
L’algorithme de Punycode sous-jacent est décrit en détail dans la RFC 3492. Le document fournit également une mise en œuvre de la procédure de codage dans la base de données C.
Lors de l’encodage de noms de domaine internationalisés, les utilisateurs utilisent généralement des convertisseurs Punycode disponibles gratuitement.
Convertisseurs Punycode gratuits
Des convertisseurs Punycode gratuits pour transférer les IDN dans une représentation compatible ACII peuvent être trouvés sur différents sites Web.
Pour l’espace de nommage avec un domaine de premier niveau, nous recommandons l’outil Punycoder Converter. Il convertit les noms de domaine internationaux selon les normes IDNA actuelles (RFC 5890 à 5894).
Enfin, le Convertisseur Punycode de Mathias Bynens basé sur punycode.js.
Punycode pour les noms de domaine en emojis
Non seulement les noms de domaine internationalisés, mais aussi les noms de domaines en emojis peuvent être réalisés via punycode. La condition préalable est que le domaine de premier niveau respectif permette l’utilisation d’émojis et que l’émoticône souhaitée ait été enregistrée dans le standard Unicode.
Actuellement, les TLD suivants : ws, .tk, .to, .ml, .ga, .cf, .gq et .fm permettent l’enregistrement des noms de domaine en emojis.
Les noms de domaine en emojis sont techniquement traités comme du punycode, mais en théorie ils devraient être présentés à l’utilisateur comme une combinaison de texte et d’émoticônes.
Domaine Emoji : i❤.ws/
ACE : xn--i-7iq.ws/
Pratiquement aucun navigateur standard ne l’implémente à l’heure actuelle. Si vous entrez un domaine emoji dans Firefox, Chrome, Safari, Edge ou Opera, la barre d’adresse affiche uniquement la chaîne ACE.
Punycode comme risque de sécurité ?
Le punycode devient un risque pour la sécurité dans le cadre des attaques d’hameçonage (phishing) homographique. Ce sont des cyberattaques où les hackers utilisent l’apparence similaire de différents caractères pour attirer leurs victimes peu méfiantes vers de faux sites Web.
Le Blogger Xudong Zheng a montré a quoi une telle attaque de phishing peut ressembler en utilisant le domaine punycode suivant :
https://www.xn--80ak6aa92e.com/
Ceci conduit l’internaute vers un site Web avec l’IDN suivant :
https://www.аррӏе.com/
L’URL fournie n’est pas le site Web officiel de la firme californienne Apple Inc. mais un site Web de phishing créé à des fins de démonstration.
Au lieu du caractère ASCII a avec Unicode U+0061, on utilise le caractère cyrillique а (U+0430) - ces deux caractères peuvent difficilement être distingués à l’œil nu, mais sont interprétés comme différents caractères par les navigateurs Web.
Ce qui est particulièrement défavorable pour les internautes est le fait que même les certificats n’offrent pas de sécurité. En effet, les criminels enregistrent des certificats SSL valides pour les campagnes de phishing modernes, qui sont censés donner à ces sites l’apparence d’une légitimité.
Les versions actuelles de Chrome et Opera empêchent ce type d’attaques de phishing en affichant la chaîne ACE au lieu du domaine internationalisé sur les IDN qui mélangent des caractères de différents jeux de caractères. Internet Explorer et Microsoft Edge empêchent complètement l’appel des domaines correspondants. Seul Firefox n’offre aucune protection contre le phishing punycode.
C’est ainsi que les utilisateurs de Firefox peuvent se protéger : afin de réduire le risque de phishing des sites Web, les utilisateurs de Firefox n’ont actuellement que la possibilité d’empêcher la traduction du punycode en IDN en général. Deux étapes seulement sont nécessaires pour cette solution temporaire :
- Appeler l’éditeur de configuration : Entrez about:config dans la barre d’adresse du navigateur Web pour ouvrir l’éditeur de configuration Firefox.
- Forcer Punycode : localisez le paramètre network.IDN_show_punycode et changez la valeur false à true.
Après configuration, Firefox affichera les domaines internationalisés dans la barre d’adresse sous forme de chaînes ACE.