Wat is Punycode?
Punycode is een coderingssyntaxis die in RFC 3492 is vastgelegd en Unicode-tekenreeksen omzet naar de beperkte ASCII-tekenset die DNS ondersteunt. Het is de technische basis voor geïnternationaliseerde domeinnamen (IDN's), waardoor domeinnamen in elke taal met de bestaande DNS-infrastructuur kunnen werken.
Het probleem dat Punycode oplost
Het Domain Name System is in de jaren tachtig ontworpen met alleen ASCII-tekens in gedachten. DNS-labels mogen alleen het volgende bevatten:
- Kleine letters (a-z)
- Cijfers (0-9)
- Koppeltekens (-)
Door deze beperking werden miljarden internetgebruikers uitgesloten die niet hoofdzakelijk het Latijnse alfabet gebruiken. Punycode overbrugt die kloof door elke Unicode-tekenreeks naar geldige ASCII om te zetten.
Hoe Punycode werkt
Punycode gebruikt een slim algoritme dat ASCII-tekens behoudt en niet-ASCII-tekens tegelijk in een compacte ASCII-weergave codeert.
Het coderingsproces
1. Tekens scheiden: splits de ASCII- en niet-ASCII-tekens
2. ASCII kopiëren: behoud alle ASCII-tekens op hun oorspronkelijke positie
3. Niet-ASCII coderen: gebruik een gegeneraliseerde codering met gehele getallen van variabele lengte
4. Voorvoegsel toevoegen: plaats "xn--" ervoor om Punycode-codering aan te geven
Voorbeelden
| Oorspronkelijk (Unicode) | Gecodeerd (Punycode) |
|---|---|
| münchen | xn--mnchen-3ya |
| 北京 | xn--fiqs8s |
| münchen.de | xn--mnchen-3ya.de |
| 中文.com | xn--fiq228c.com |
| café.com | xn--caf-dma.com |
Het voorvoegsel "xn--"
Het voorvoegsel "xn--" heet het ACE-voorvoegsel (ASCII Compatible Encoding). Het geeft aan DNS-resolvers en toepassingen aan dat het label Punycode-gecodeerde inhoud bevat. Dit voorvoegsel:
- Is altijd in kleine letters
- Komt nooit voor in gewone ASCII-domeinnamen
- Activeert Unicode-decodering in compatibele software
Punycode in de praktijk
Browserverwerking
Moderne browsers verwerken Punycode automatisch:
User types: 中文.com
Browser sends: xn--fiq228c.com (to DNS)
Browser displays: 中文.com (in address bar)
Implementatie voor ontwikkelaars
JavaScript (Node.js):const punycode = require('punycode/');
// Encode to Punycode
const encoded = punycode.toASCII('münchen.de');
// Result: xn--mnchen-3ya.de
// Decode from Punycode
const decoded = punycode.toUnicode('xn--mnchen-3ya.de');
// Result: münchen.de
Python:
domain = 'münchen.de'
encoded = domain.encode('idna').decode('ascii')
# Result: xn--mnchen-3ya.de
URL-verwerking
Bij het werken met URL's die IDN's bevatten:
// URL API handles Punycode automatically
const url = new URL('https://中文.com/path');
console.log(url.hostname); // xn--fiq228c.com
console.log(url.href); // https://xn--fiq228c.com/path
Veiligheidsgevolgen
Doordat Punycode elk Unicode-teken kan weergeven, ontstaan er beveiligingsrisico's:
Visuele spoofing
Een aanvaller kan domeinen registreren die identiek lijken aan legitieme websites:
аррlе.com (Cyrillic 'а' and 'р')
apple.com (Latin letters)
In sommige lettertypen zien beide er identiek uit, terwijl het om verschillende domeinen gaat.
Browserbeveiliging
Om spoofing tegen te gaan, gebruiken browsers verschillende beschermingsmaatregelen:
1. Detectie van gemengde schriften: toon Punycode voor domeinen die op verdachte wijze verschillende schriften combineren
2. Detectie van verwisselbare tekens: markeer domeinen met tekens die op ASCII lijken
3. Whitelist: sta Unicode-weergave alleen toe voor bekende TLD's
Punycode in API's
Bij het bouwen van domeinapplicaties:
Sla Punycode altijd op: gebruik intern de ASCII-vorm voor consistentie en database-indexering. Accepteer beide vormen: laat gebruikers Unicode of Punycode invoeren en converteer de invoer waar nodig. Toon Unicode: geef de voor mensen leesbare vorm weer in gebruikersinterfaces.function normalizeDomain(input) {
const punycode = require('punycode/');
// Convert to lowercase Punycode for internal use
return punycode.toASCII(input.toLowerCase());
}
Punycode is voor de meeste gebruikers onzichtbaar, maar essentiële kennis voor ontwikkelaars die geïnternationaliseerde webapplicaties bouwen.