Punycode er en stan­dar­di­se­ret kod­nings­me­to­de, der gør det muligt at omdanne Unicode-tegn ved hjælp af et begrænset ASCII-tegnsæt, hvilket betyder, at in­ter­na­tio­na­li­se­re­de do­mæ­ne­nav­ne (IDN) også kan indeholde ikke-ASCII-tegn, såsom umlauter.

Hvordan blev kod­nings­me­to­den udviklet?

I 2003 blev Punycode stan­dar­di­se­ret af Internet En­gi­ne­e­ring Task Force (IETF) som syntaks til kodning af in­ter­na­tio­na­li­se­re­de do­mæ­ne­nav­ne i ap­pli­ka­tio­ner (IDNA). IETF definerer et do­mæ­ne­navn som et IDN, hvis det in­de­hol­der spe­ci­al­tegn såsom di­a­kri­ti­ske tegn, bogstaver eller tegn, der ikke findes i det latinske alfabet (f.eks. umlauter på tysk). Sådanne tegn kan ikke behandles af grund­læg­gen­de pro­tokol­ler såsom Domain Name System (DNS). I dette eksempel bruger vi et do­mæ­ne­navn på tysk. Selvom müller-büromöbel (Müllers kon­tormøb­ler) efter ind­fø­rel­sen af IDN’er er tilladt under top­do­mæ­net .de, kan det kun behandles ved at kode de ikke-basale tegn, f.eks. i for­bin­del­se med nav­ne­op­løs­ning. Talrige in­ter­net­pro­tokol­ler er baseret på engelsk og un­der­støt­ter derfor kun det be­græn­se­de ASCII-tegnsæt.

For at sikre kom­pa­ti­bi­li­tet mellem IDN’er og ældre in­ter­net­stan­dar­der har IETF fastlagt en metode til kodning af in­ter­na­tio­na­li­se­re­de do­mæ­ne­nav­ne ved hjælp af de tegn, der allerede var tilladt. Denne stan­dar­di­se­re­de kod­nings­pro­ce­du­re kaldes Punycode.

Note

For e-mailadres­ser anvendes Punycode kun til in­ter­na­tio­na­li­se­re­de e-mail­do­mæ­ner. Hvis den lokale del (før @-tegnet) in­de­hol­der ikke-ASCII-tegn, kodes den ved hjælp af UTF-8.

Hvordan fungerer Punycode-kodning?

En oversigt over Punycode-processen

Punycode er defineret af IETF i RFC 3492 som en mulig an­ven­del­se af den generelle kod­nings­al­go­rit­me kendt som Boot­string. Boot­string-al­go­rit­men gør det muligt at kortlægge tegn­stren­ge, der består af vil­kår­li­ge tegnsæt, ved hjælp af et begrænset udvalg af elementer. Ud­vik­lin­gen af kod­nings­me­to­den bygger på seks prin­cip­per. I Punycode-kodning kaldes disse elementer basistegn, som består af små bogstaver, tal og bin­de­stre­gen (-). Ud­vik­lin­gen af kod­nings­me­to­den er baseret på seks prin­cip­per.

  • Fuld­stæn­dig­hed: Hver ud­gangs­streng kan knyttes til en forenklet streng ved hjælp af en boot-streng.
  • Unikhed: Til­de­lin­gen af ud­gangs­stren­gen til den respek­ti­ve Boot­string-kodning er unik. Hver Punycode kan tildeles nøjagtigt én ASCII-modstykke og omvendt.
  • Re­ver­si­bi­li­tet: En Boot­string-kodning kan til enhver tid vendes uden tab af in­for­ma­tion.
  • Ef­fek­ti­vi­tet: Den kodede streng er – hvis over­ho­ve­det – kun minimalt længere end ud­gangs­stren­gen.
  • Enkelhed: Boot­string bruger enkle kodnings- og af­kod­nings­al­go­rit­mer.
  • Læsbarhed: Kun tegn, der ikke kan re­præ­sen­te­res i må­l­tegns­sæt­tet, kodes. Alle andre tegn forbliver uændrede.

Punycode definerer Boot­string i over­ens­stem­mel­se med kravene til in­ter­na­tio­na­li­se­re­de do­mæ­ne­nav­ne. Dette bør gøre det muligt at omdanne Unicode-tegn ved hjælp af de tidligere tilladte basistegn.

Eksempel på Punycode

Følgende eksempel viser, hvordan kodningen fungerer:

IDN: müller-kon­tormøb­ler

IDN-domænet „müller-büromöbel“ in­de­hol­der tegnene „ü“ og „ö“, som ikke indgår i det tidligere tilladte tegnsæt for do­mæ­ne­nav­ne. Derfor skal de kodes via Punycode for at sikre kom­pa­ti­bi­li­tet.

Trin 1: Nor­ma­li­se­ring

I det første trin muliggør kod­nings­pro­ce­du­ren en nor­ma­li­se­ring af den udgående tegn­streng. Alle store bogstaver erstattes med de til­sva­ren­de små bogstaver.

Trin 2: Fjernelse af alle ikke-basale tegn

I det næste trin fjernes alle tegn, der ikke er grundtegn. Disse tilføjes derefter til do­mæ­ne­nav­net i kodet form og adskilles med en bin­de­streg.

Hvis Punycode-syntaksen bruges til at kode in­ter­ne­tadres­ser, forsynes hver re­sul­tat­streng med et ACE-præfiks (for­kor­tel­se for ASCII-kom­pa­ti­bel kodning):

ACE-præfiks: xn–

Præfikset ACE sikrer, at do­mæ­ne­nav­ne, der in­de­hol­der bin­de­stre­ger, ikke fejl­ag­tigt tolkes som in­ter­na­tio­na­le do­mæ­ne­nav­ne.

Dette re­sul­te­rer i følgende kodning for IDN’et müller-büromöbel:

ACE: xn–mller-brombel-rmb4fg

Den algoritme, der ligger til grund for Punycode-pro­ce­du­ren, er be­mær­kel­ses­vær­dig. Den sikrer, at do­mæ­ne­nav­ne trods kon­ver­te­rin­gen ikke over­skri­der den maksimale længde på 63 tegn.

Under kod­nings­pro­ces­sen kon­ver­te­res Unicode-tegn ikke én-til-én til ASCII-tegn. I stedet fast­læg­ger al­go­rit­men en streng ud fra afstanden mellem de slettede tegn og tegnets placering i den udgående streng.

I for­bin­del­se med eksemplet ovenfor angiver strengen rmb4fg, at mller-brombel skal suppleres med Unicode-tegnene ü og ö på hen­holds­vis anden og syvende plads.

Billede: Overview of sections of the ACE string
The ACE string consists of the ACE prefix and a puny-coded string.

Und­ta­gel­ser fra reglen

Der opstår af­vi­gel­ser, hvis do­mæ­ne­nav­net ikke in­de­hol­der nogen tegn, der ikke er basistegn, eller hvis det ude­luk­ken­de in­de­hol­der tegn, der ikke er basistegn.

Et do­mæ­ne­navn, der ude­luk­ken­de består af ikke-basistegn, viser efter kodning kun den kodede streng og ACE-præfikset. Et do­mæ­ne­navn som f.eks. παράδειγμα (græsk for »eksempel«) svarer til følgende kodning:

IDN: eksempel

ACE: xn–hxajbheg2az3al

Hvis et do­mæ­ne­navn ude­luk­ken­de består af stan­dard­tegn, anvendes Punycode ikke. Der tilføjes derfor ikke noget ACE-præfiks. Kodning er i dette tilfælde ikke nødvendig, da de grund­læg­gen­de in­ter­net­pro­tokol­ler allerede kan fortolke do­mæ­ne­nav­net.

Hvis man betragter det fuldt kva­li­fi­ce­re­de do­mæ­ne­navn (FQDN) som en helhed, kodes hver enkelt del (topdomæne, an­den­ni­veau-domæne, tred­je­ni­veau-domæne osv.) separat. Et domænesom пример.bg (bulgarsk for »example.bg«) kunne kodes som følger

IDN: eksempel.bg

ACE: xn–e1afmkfd.xn–90ae

Ne­den­stå­en­de tabel giver et overblik over de for­skel­li­ge varianter af Punycode-syntaksen.

IDN Punycode ACE
Basistegn og ikke-basistegn müller-büromöbel.de mller-brombel-rmb4fg.de xn--mller-brombel-rmb4fg.de
Kun ikke-basistegn Παράδειγμα.gr hxajbheg2az3al.gr xn--hxajbheg2az3al.gr
Kun basistegn example.org example.org Ingen an­ven­del­se
Note

Punycode-al­go­rit­men er beskrevet i detaljer i RFC 3492. Desuden in­de­hol­der do­ku­men­tet en im­ple­men­te­ring af kod­nings­pro­ce­du­ren i pro­gram­me­rings­spro­get C.

Brugere benytter sig som regel af gratis Punycode-kon­ver­te­re til at kode in­ter­na­tio­na­li­se­re­de do­mæ­ne­nav­ne.

Enkel kodning med emoji-domæner

Ikke kun in­ter­na­tio­na­li­se­re­de do­mæ­ne­nav­ne, men også emoji-domæner kan re­a­li­se­res via Punycode. For at dette skal fungere, skal top­do­mæ­net dog tillade brug af emojier, og det ønskede emoji skal være defineret i Unicode-stan­dar­den.

Tip

I øje­blik­ket er det muligt at re­gi­stre­re emoji-domæner under følgende top­do­mæ­ner: .ws, .tk, .to, .ml, .ga, .cf, .gq og .fm.

Emoji-domæner behandles teknisk set som Punycode, men bør i teorien vises for brugeren som en kom­bi­na­tion af tekst og emo­ti­ko­ner.

Emoji-domæne: https://i❤.ws/

ACE: https://xn--i-7iq.ws/

Stort set ingen stan­dard­brow­se­re un­der­støt­ter dette på nuværende tidspunkt. Hvis du indtaster et emoji-domæne i Firefox, Chrome, Safari, Edge eller Opera, viser adres­se­linj­en kun ACE-strengen.

Findes der gratis Punycode-kon­ver­te­re?

Der findes gratis Punycode-ge­ne­ra­to­rer, der kon­ver­te­rer IDN-adresser til et ASCII-kom­pa­ti­belt format, på for­skel­li­ge hjem­mesi­der. Et eksempel er Punycoder.

Billede: Punycoder, the Punycode converter
Punycoder converts Punycode to Text/Unicode and vice-versa.

Til IDN’er under andre top­do­mæ­ner er Punycode-kon­ver­te­ren af Mathias Bynens, der er baseret på punycode.js, et godt valg.

Billede: The Punycode converter made by Mathias Bynens based on punycode.js
With his *Punycode domain name converter,*Mathias Bynens offers an open-source tool for con­ver­ting in­ter­na­tio­na­li­sed domains.

Udgør Punycode en sik­ker­heds­ri­si­ko?

Punycode udgør en sik­ker­heds­ri­si­ko i for­bin­del­se med ho­mo­gra­fisk phishing – cy­be­ran­greb, hvor kri­mi­nel­le udnytter, at for­skel­li­ge tegn ligner hinanden, for at lokke in­te­ta­nen­de ofre til falske hjem­mesi­der. Bloggeren Xudong Zheng viser, hvordan et phishing-angreb ser ud, ved at tage følgende Punycode-domæne https://www.xn--80ak6aa92e.com/ som eksempel. Dette fører in­ter­net­bru­ge­re til en hjem­mesi­de med følgende IDN: https://www.аррӏе.com/

Den angivne URL er ikke den of­fi­ci­el­le hjem­mesi­de for det ca­li­for­ni­ske tek­no­lo­gi­sel­skab Apple Inc., men en phishing-hjem­mesi­de, der er oprettet til de­mon­stra­tions­for­mål.

I stedet for ASCII-tegnet »a« med Unicode-koden U+0061 anvendes det ky­ril­li­ske tegn »а« (U+0430) – disse to tegn kan næsten ikke skelnes med det blotte øje, men tolkes som for­skel­li­ge tegn af web­brow­se­re. Selv cer­ti­fi­ka­ter kan ikke garantere sikkerhed for in­ter­net­bru­ger­ne. I for­bin­del­se med moderne phishing-kampagner opretter kri­mi­nel­le gyldige SSL-cer­ti­fi­ka­ter med det formål at få deres hjem­mesi­der til at fremstå som au­ten­ti­ske.

De nyeste versioner af Chrome og Opera for­hin­drer phishing-angreb som disse ved at vise ACE-strengen i stedet for det in­ter­na­tio­na­li­se­re­de do­mæ­ne­navn på IDN’er, der in­de­hol­der tegn fra for­skel­li­ge tegnsæt. Internet Explorer og Microsoft Edge for­hin­drer adgang til domæner som disse. Firefox tilbyder derimod ingen be­skyt­tel­se mod Punycode-phishing.

Billede: Example of a homographic attack
Example of a ho­mo­grap­hic domain: The URL looks the same as Apple’s official website, however, the Unicode character U+0430 is actually a Cyrillic letter that is asto­nis­hin­g­ly similar to the ASCII character a.

Sådan kan Firefox-brugere beskytte sig selv. For at mindske risikoen ved phishing-websteder har Firefox-brugere i øje­blik­ket kun mulighed for generelt at forhindre, at Punycode over­sæt­tes til IDN’er. Denne mid­ler­ti­di­ge løsning kræver kun to trin:

  1. Åbn kon­fi­gu­ra­tions­re­di­ge­rings­værk­tø­jet: Skriv about:config i adres­se­linj­en i din web­brow­ser for at åbne Firefox’ kon­fi­gu­ra­tions­re­di­ge­rings­værk­tøj.
  2. Tving Punycode: Find indstil­lin­gen network.IDN_show_punycode og ændr dens værdi fra false til true.

Efter kon­fi­gu­ra­tio­nen viser Firefox in­ter­na­tio­na­li­se­re­de domæner i adres­se­linj­en som ACE-strenge.

Gå til ho­ved­me­nu­en