Hoe internationaliseerde domeinnamen te converteren met Punycode
Punycode is een gestandaardiseerde coderingsmethode waarmee Unicode-tekens kunnen worden weergegeven met behulp van een beperkte ASCII-tekenset, wat betekent dat geïnternationaliseerde domeinnamen (IDN’s) ook niet-ASCII-tekens kunnen bevatten, zoals bijvoorbeeld umlauten.
Hoe is de coderingsmethode ontwikkeld?
In 2003 werd Punycode door de Internet Engineering Task Force (IETF) gestandaardiseerd als syntaxis voor het coderen van geïnternationaliseerde domeinnamen in toepassingen (IDNA). De IETF definieert een domeinnaam als een IDN als deze speciale tekens bevat, zoals diakritische tekens, letters of tekens die niet in het Latijnse alfabet voorkomen (bijvoorbeeld umlauten in het Duits). Dergelijke tekens kunnen niet worden verwerkt door basisprotocollen zoals het Domain Name System (DNS). Voor dit voorbeeld gebruiken we een domeinnaam in het Duits. Hoewel müller-büromöbel (Müllers kantoormeubilair) sinds de introductie van IDN’s is toegestaan onder het topniveaudomein .de, kan het alleen worden verwerkt door de niet-basetekens te coderen, bijvoorbeeld in de context van naamresolutie. Talrijke internetprotocollen zijn gebaseerd op het Engels en ondersteunen daarom alleen de beperkte ASCII-tekenset.
Om compatibiliteit tussen IDN’s en oudere internetstandaarden te garanderen, heeft de IETF een methode voorgeschreven voor het coderen van geïnternationaliseerde domeinnamen met behulp van de tekens die al waren toegestaan. Deze gestandaardiseerde coderingsprocedure staat bekend als Punycode.
Voor e-mailadressen wordt Punycode alleen gebruikt voor geïnternationaliseerde e-maildomeinen. Als het lokale gedeelte (vóór het @-teken) niet-ASCII-tekens bevat, wordt het gecodeerd via UTF-8.
Hoe werkt Punycode-codering?
Een overzicht van het Punycode-proces
Punycode wordt door de IETF in RFC 3492 gedefinieerd als een mogelijke toepassing van het algemene coderingsalgoritme dat bekend staat als Bootstring. Het Bootstring-algoritme maakt het mogelijk om tekenreeksen die bestaan uit willekeurige tekensets met een beperkte selectie van elementen in kaart te brengen. De ontwikkeling van de coderingsprocedure is gebaseerd op zes principes. In Punycode-codering worden deze elementen basistekens genoemd, die bestaan uit kleine letters, cijfers en het koppelteken (-). De ontwikkeling van de coderingsmethode is gebaseerd op zes principes.
- Volledigheid: Elke uitvoerstring kan worden toegewezen aan een vereenvoudigde string met behulp van een bootstring.
- Uniekheid: Het toewijzen van de uitvoerstring aan de respectieve Bootstring-codering is uniek. Elke Punycode kan precies één ASCII-tegenhanger worden toegewezen en vice versa.
- Omkeerbaarheid: Een Bootstring-codering kan op elk moment worden omgekeerd zonder verlies van informatie.
- Efficiëntie: De gecodeerde string is – indien al – slechts minimaal langer dan de outputstring.
- Eenvoud: Bootstring maakt gebruik van eenvoudige coderings- en decoderingsalgoritmen.
- Leesbaarheid: Alleen tekens die niet in de doeltekenset kunnen worden weergegeven, worden gecodeerd. Alle andere tekens blijven ongewijzigd.
Punycode specificeert Bootstring volgens de vereisten voor geïnternationaliseerde domeinnamen. Hierdoor zouden de Unicode-tekens moeten kunnen worden toegewezen via de eerder toegestane basistekens.
Voorbeeld van Punycode
Het volgende voorbeeld laat zien hoe de codering werkt:
IDN: Müller-Büromöbel
De IDN müller-büromöbel bevat de tekens ü en ö, die niet zijn opgenomen in de eerder toegestane tekenset voor domeinnamen. Daarom moeten ze worden gecodeerd via Punycode om compatibiliteit te garanderen.
Stap 1: Normalisatie
In de eerste stap zorgt de coderingsprocedure voor normalisatie van de uitvoertekensreeks. Alle hoofdletters worden vervangen door de overeenkomstige kleine letters.
Stap 2: Verwijdering van alle niet-basistekens
In de tweede stap worden alle niet-basisteken verwijderd. Deze worden vervolgens in gecodeerde vorm aan de domeinnaam toegevoegd en gescheiden door een koppelteken.
Als de Punycode-syntaxis wordt gebruikt om internetadressen te coderen, wordt elke resultaatstring voorzien van een ACE-voorvoegsel (afkorting van ASCII-compatible encoding):
ACE-voorvoegsel: xn–
Het voorvoegsel ACE zorgt ervoor dat domeinnamen met koppeltekens niet verkeerd worden geïnterpreteerd als internationale domeinnamen.
Dit resulteert in de volgende codering voor de IDN müller-büromöbel:
ACE: xn–mller-brombel-rmb4fg
Het algoritme dat ten grondslag ligt aan de Punycode-procedure is opmerkelijk. Het zorgt ervoor dat domeinnamen ondanks de conversie niet langer worden dan de maximale lengte van 63 tekens.
Tijdens het coderingsproces worden Unicode-tekens niet één op één omgezet in ASCII-tekens. In plaats daarvan bepaalt het algoritme een tekenreeks op basis van de afstand tussen de gewiste tekens en de positie van de tekens in de uitvoertekenreeks.
Met betrekking tot het bovenstaande voorbeeld geeft de tekenreeks rmb4fg aan dat mller-brombel moet worden aangevuld met de Unicode-tekens ü en ö op de tweede en zevende positie.

Uitzonderingen op de regel
Er treden afwijkingen op als de domeinnaam geen niet-basetekens bevat of als deze alleen niet-basetekens bevat.
Een domeinnaam die alleen niet-basetekens bevat, toont na codering alleen de gecodeerde tekenreeks en het ACE-voorvoegsel. Een domeinnaam zoals παράδειγμα (Grieks voor ‘voorbeeld’) komt overeen met de volgende codering:
IDN: voorbeeld
ACE: xn–hxajbheg2az3al
Als een domeinnaam alleen basistekens bevat, wordt Punycode niet gebruikt. Er wordt dan ook geen ACE-voorvoegsel toegevoegd. Codering is in dit geval niet nodig, omdat de domeinnaam al door de basisinternetprotocollen kan worden begrepen.
Als je de volledig gekwalificeerde domeinnaam (FQDN) als geheel beschouwt, wordt elk label (topniveaudomein, tweedeniveaudomein, derdeniveaudomein, enz.) afzonderlijk gecodeerd. Een domeinals пример.бг (Bulgaars voor ‘example.bg’) zou als volgt kunnen worden gecodeerd
IDN: пример.бг
ACE: xn–e1afmkfd.xn–90ae
De volgende tabel geeft een overzicht van de verschillende varianten van de Punycode-syntaxis.
| IDN | Punycode | ACE | |
|---|---|---|---|
| Basis- en niet-basiskarakters | müller-büromöbel.de
|
mller-brombel-rmb4fg.de
|
xn--mller-brombel-rmb4fg.de
|
| Alleen niet-basis tekens | Παράδειγμα.gr
|
hxajbheg2az3al.gr
|
xn--hxajbheg2az3al.gr
|
| Alleen basetekens | example.org
|
example.org
|
Geen gebruik |
Het Punycode-algoritme wordt gedetailleerd beschreven in RFC 3492. Daarnaast bevat het document een implementatie van de coderingsprocedure in de programmeertaal C.
Gebruikers maken meestal gebruik van vrij beschikbare Punycode-converters voor het coderen van geïnternationaliseerde domeinnamen.
Puny-codering met emoji-domeinen
Niet alleen geïnternationaliseerde domeinnamen, maar ook emoji-domeinen kunnen via Punycode worden gerealiseerd. Om dit te laten werken, moet het topniveaudomein echter het gebruik van emoji’s toestaan en moet de gewenste emoticon in de Unicode-standaard staan.
Op dit moment kunnen emoji-domeinen worden geregistreerd onder de volgende TLD’s: .ws, .tk, .to, .ml, .ga, .cf, .gq en .fm.
Emoji-domeinen worden technisch verwerkt als Punycode, maar zouden in theorie aan de gebruiker moeten worden gepresenteerd als een combinatie van tekst en emoticons.
Emoji-domein: https://i❤.ws/
ACE: https://xn--i-7iq.ws/
Op dit moment implementeert vrijwel geen enkele standaardbrowser dit. Als je een emoji-domein invoert in Firefox, Chrome, Safari, Edge of Opera, toont de adresbalk alleen de ACE-string.
Zijn er gratis Punycode-converters?
Gratis Punycode-generatoren die IDN’s omzetten naar een ASCII-compatibele vorm zijn te vinden op verschillende websites. Een voorbeeld hiervan is Punycoder.

Voor IDN’s van andere TLD’s is de Punycode-converter van Mathias Bynens, gebaseerd op punycode.js, een goede keuze.

Vormt Punycode een veiligheidsrisico?
Punycode vormt een veiligheidsrisico in het geval van homografische phishing – cyberaanvallen waarbij criminelen gebruikmaken van het gelijkaardige uiterlijk van verschillende tekens om nietsvermoedende slachtoffers naar valse websites te lokken. Blogger Xudong Zheng laat zien hoe een phishingaanval eruitziet aan de hand van het volgende Punycode-domein https://www.xn--80ak6aa92e.com/ als voorbeeld. Dit leidt internetgebruikers naar een website met de volgende IDN: https://www.аррӏе.com/
De opgegeven URL is niet de officiële website van het Californische technologiebedrijf Apple Inc., maar een phishingwebsite die voor demonstratiedoeleinden is gemaakt.
In plaats van het ASCII-teken a met Unicode U+0061 wordt het Cyrillische а (U+0430) gebruikt – deze twee tekens zijn met het blote oog nauwelijks te onderscheiden, maar worden door webbrowsers als verschillende tekens geïnterpreteerd. Zelfs certificaten kunnen internetgebruikers geen veiligheid bieden. Voor moderne phishingcampagnes maken criminelen geldige SSL-certificaten aan om hun websites authentiek te laten lijken.
De huidige versies van Chrome en Opera voorkomen dit soort phishingaanvallen door de ACE-string weer te geven in plaats van het geïnternationaliseerde domein op IDN’s die tekens uit verschillende tekensets combineren. Internet Explorer en Microsoft Edge voorkomen dat domeinen zoals deze worden geopend. Firefox biedt echter geen bescherming tegen Punycode-phishing.

Zo kunnen Firefox-gebruikers zichzelf beschermen. Om het risico van phishingwebsites te verminderen, hebben Firefox-gebruikers momenteel alleen de mogelijkheid om te voorkomen dat Punycode in het algemeen wordt vertaald naar IDN’s. Voor deze tijdelijke oplossing zijn slechts twee stappen nodig:
- Open de configuratie-editor: typ about:config in de adresbalk van uw webbrowser om de Firefox-configuratie-editor te openen.
- Forceer Punycode: Zoek de instelling network.IDN_show_punycode en wijzig de waarde van false in true.
Na configuratie zal Firefox geïnternationaliseerde domeinen in de adresbalk weergeven als ACE-strings.