Punycode är en stan­dar­di­se­rad kod­nings­me­tod som gör det möjligt att mappa Unicode-tecken med hjälp av en begränsad ASCII-tec­ken­sats, vilket innebär att in­ter­na­tio­na­li­se­ra­de domännamn (IDN) också kan innehålla icke-ASCII-tecken, till exempel omljud.

Hur ut­veck­la­des kod­nings­me­to­den?

2003 stan­dar­di­se­ra­des Punycode av Internet Engi­ne­e­ring Task Force (IETF) som syntax för kodning av in­ter­na­tio­na­li­se­ra­de domännamn i ap­pli­ka­tio­ner (IDNA). IETF de­fi­ni­e­rar ett domännamn som ett IDN om det in­ne­hål­ler spe­ci­al­tec­ken såsom di­akri­tis­ka tecken, bokstäver eller tecken som inte finns i det latinska alfabetet (t.ex. omljud i tyska). Sådana tecken kan inte bearbetas av grund­läg­gan­de protokoll såsom Domain Name System (DNS). I det här exemplet använder vi ett domännamn på tyska. Även om müller-büromöbel (Müllers kon­torsmöb­ler) är tillåtet under topp­do­mä­nen .de efter in­fö­ran­det av IDN, kan det endast bearbetas genom att koda de icke-bas­teck­nen, till exempel i samband med namn­upp­lös­ning. Många in­ter­net­pro­to­koll är baserade på engelska och stöder därför endast den be­grän­sa­de ASCII-tec­ken­sat­sen.

För att sä­ker­stäl­la kom­pa­ti­bi­li­tet mellan IDN och äldre in­ter­netstan­dar­der har IETF fö­re­skri­vit en metod för kodning av in­ter­na­tio­na­li­se­ra­de domännamn med hjälp av de tecken som redan var tillåtna. Denna stan­dar­di­se­ra­de kod­nings­pro­ce­dur kallas Punycode.

Notis

För e-post­a­dres­ser används Punycode endast för in­ter­na­tio­na­li­se­ra­de e-post­do­mä­ner. Om den lokala delen (före @-tecknet) in­ne­hål­ler icke-ASCII-tecken kodas den med UTF-8.

Hur fungerar Punycode-kodning?

En översikt över Punycode-processen

Punycode de­fi­nie­ras av IETF i RFC 3492 som en möjlig tillämp­ning av den allmänna kod­nings­al­go­rit­men Boot­st­ring. Boot­st­ring-al­go­rit­men möjliggör mappning av tec­ken­sträng­ar som består av god­tyck­li­ga tec­ken­upp­sätt­ning­ar med ett begränsat urval av element. Ut­veck­ling­en av kod­nings­pro­ce­du­ren baseras på sex principer. I Punycode-kodningen kallas dessa element bastecken, som består av små bokstäver, siffror och bin­de­streck (-). Ut­veck­ling­en av kod­nings­me­to­den baseras på sex principer.

  • Full­stän­dig­het: Varje ut­da­ta­sträng kan mappas till en förenklad sträng med hjälp av en boot­st­ring.
  • Unikhet: Till­del­ning­en av ut­da­ta­sträng­en till re­spek­ti­ve boot­st­ring-kodning är unik. Varje Punycode kan tilldelas exakt en ASCII-mot­sva­rig­het och vice versa.
  • Re­ver­si­bi­li­tet: En boot­st­ring-kodning kan när som helst re­ver­se­ras utan att någon in­for­ma­tion går förlorad.
  • Ef­fek­ti­vi­tet: Den kodade strängen är – om ens alls – bara minimalt längre än ut­da­ta­sträng­en.
  • Enkelhet: Boot­st­ring använder enkla kodnings- och av­kod­nings­al­go­rit­mer.
  • Läsbarhet: Endast tecken som inte kan re­pre­sen­te­ras i mål­tec­ken­sat­sen kodas. Alla andra tecken förblir oför­änd­ra­de.

Punycode spe­ci­fi­ce­rar Boot­st­ring enligt kraven för in­ter­na­tio­na­li­se­ra­de domännamn. Detta bör göra det möjligt att mappa Unicode-tecken via de tidigare tillåtna bas­teck­nen.

Exempel på punycode

Följande exempel visar hur kodningen fungerar:

IDN: müller-büromöbel

IDN müller-büromöbel in­ne­hål­ler tecknen ü och ö, som inte ingår i den tidigare tillåtna tec­ken­upp­sätt­ning­en för domännamn. Därför måste de kodas med Punycode för att sä­ker­stäl­la kom­pa­ti­bi­li­tet.

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

I det första steget möjliggör kod­nings­pro­ce­du­ren nor­ma­li­se­ring av den utgående tec­ken­sträng­en. Alla versaler ersätts med mot­sva­ran­de gemener.

Steg 2: Utrotning av alla icke-grund­läg­gan­de tecken

I det andra steget raderas alla tecken som inte är grund­tec­ken. Dessa läggs sedan till do­män­nam­net i kodad form och separeras med ett bin­de­streck.

Om Punycode-syntaxen används för att koda in­ter­ne­t­a­dres­ser, förses varje re­sul­tat­s­träng med ett ACE-prefix (för­kort­ning för ASCII-kom­pa­ti­bel kodning):

ACE-prefix: xn–

Prefixet ACE sä­ker­stäl­ler att domännamn som in­ne­hål­ler bin­de­streck inte miss­tol­kas som in­ter­na­tio­nel­la domännamn.

Detta re­sul­te­rar i följande kodning för IDN müller-büromöbel:

ACE: xn–mller-brombel-rmb4fg

Al­go­rit­men som ligger till grund för Punycode-pro­ce­du­ren är an­märk­nings­värd. Den sä­ker­stäl­ler att do­män­nam­nen, trots kon­ver­te­ring­en, inte över­skri­der den maximala längden på 63 tecken.

Under kod­nings­pro­ces­sen kon­ver­te­ras Unicode-tecken inte en-till-en till ASCII-tecken. Istället bestämmer al­go­rit­men en sträng baserat på avståndet mellan de raderade tecknen och tecknens position i ut­da­ta­sträng­en.

I relation till exemplet ovan indikerar strängen rmb4fg att mller-brombel måste kom­plet­te­ras med Unicode-tecknen ü och ö i andra och sjunde position.

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

Undantag från regeln

Av­vi­kel­ser uppstår om do­män­nam­net inte in­ne­hål­ler några icke-bastecken eller om det endast in­ne­hål­ler icke-bastecken.

Ett domännamn som endast in­ne­hål­ler icke-bastecken visar endast den kodade strängen och ACE-prefixet efter kodningen. Ett domännamn som παράδειγμα (grekiska för ”exempel”) motsvarar följande kodning:

IDN: exempel

ACE: xn–hxajbheg2az3al

Om ett domännamn endast in­ne­hål­ler bastecken används inte Punycode. Följakt­li­gen läggs inget ACE-prefix till. Kodning är inte nödvändig i detta fall eftersom grund­läg­gan­de in­ter­net­pro­to­koll redan kan förstå do­män­nam­net.

Om man betraktar det full­stän­di­ga do­män­nam­net (FQDN) som en helhet, kodas varje etikett (toppdomän, andra nivåns domän, tredje nivåns domän osv.) separat. En domänsom пример.бг (bul­ga­ris­ka för ”example.bg”) kan kodas på följande sätt

IDN: пример.бг

ACE: xn–e1afmkfd.xn–90ae

Följande tabell ger en översikt över de olika va­ri­an­ter­na av Punycode-syntaxen.

IDN Punycode ACE
Bas- och icke-bastecken müller-büromöbel.de mller-brombel-rmb4fg.de xn--mller-brombel-rmb4fg.de
Endast icke-bastecken Παράδειγμα.gr hxajbheg2az3al.gr xn--hxajbheg2az3al.gr
Endast bastecken example.org example.org Ingen an­vänd­ning
Notis

Punycode-al­go­rit­men beskrivs i detalj i RFC 3492. Dessutom in­ne­hål­ler do­ku­men­tet en im­ple­men­te­ring av kod­nings­pro­ce­du­ren i pro­gram­me­rings­språ­ket C.

Användare använder van­ligt­vis fritt till­gäng­li­ga Punycode-kon­ver­te­ra­re för att koda in­ter­na­tio­na­li­se­ra­de domännamn.

Puny-kodning med emoji-domäner

Inte bara in­ter­na­tio­na­li­se­ra­de domännamn utan även emo­jido­mä­ner kan re­a­li­se­ras via Punycode. För att detta ska fungera måste dock topp­do­mä­nen tillåta an­vänd­ning av emojis, och den önskade emo­ti­co­nen måste finnas i Unicode-stan­dar­den.

Tips

För när­va­ran­de tillåter följande TLD:er re­gi­stre­ring av emo­jido­mä­ner: .ws, .tk, .to, .ml, .ga, .cf, .gq och .fm.

Emoji-domäner behandlas tekniskt sett som Punycode, men i teorin bör de pre­sen­te­ras för an­vän­da­ren som en kom­bi­na­tion av text och emoticons.

Emoji-domän: https://i❤.ws/

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

Praktiskt taget ingen stan­dard­webb­lä­sa­re im­ple­men­te­rar detta för när­va­ran­de. Om du anger en emo­jido­män i Firefox, Chrome, Safari, Edge eller Opera visar adress­fäl­tet endast ACE-strängen.

Finns det gratis Punycode-kon­ver­te­ra­re?

Gratis Punycode-ge­ne­ra­to­rer som omvandlar IDN till ASCII-kom­pa­ti­bel form finns på olika webb­plat­ser. Ett exempel är Punycoder.

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

För IDN:er från andra topp­do­mä­ner är Punycode-kon­ver­te­ra­ren från Mathias Bynens, baserad på punycode.js, ett bra val.

Bild: 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.

Utgör Punycode en sä­ker­hets­risk?

Punycode blir en sä­ker­hets­risk vid ho­mo­gra­fisk nätfiske – cy­be­r­at­tac­ker där brotts­ling­ar utnyttjar liknande utseende hos olika tecken för att lura intet ont anande offer till falska webb­plat­ser. Bloggaren Xudong Zheng visar hur en nät­fis­ke­at­tack ser ut med hjälp av följande Punycode-domän https://www.xn--80ak6aa92e.com/ som exempel. Detta leder in­ter­ne­tan­vän­da­re till en webbplats med följande IDN: https://www.аррӏе.com/

Den angivna web­ba­dres­sen är inte den of­fi­ci­el­la webb­plat­sen för det ka­li­for­nis­ka tek­nik­fö­re­ta­get Apple Inc., utan en phishing-webbplats som skapats i de­mon­stra­tions­syf­te.

Istället för ASCII-tecknet a med Unicode U+0061 används det ky­ril­lis­ka а (U+0430) – dessa två tecken är nästan omöjliga att skilja åt med blotta ögat, men tolkas som olika tecken av webb­lä­sa­re. Inte ens cer­ti­fi­kat kan garantera sä­ker­he­ten för in­ter­ne­tan­vän­da­re. I moderna phishing-kampanjer skapar brotts­ling­ar giltiga SSL-cer­ti­fi­kat i syfte att få sina webb­plat­ser att se au­ten­tis­ka ut.

Aktuella versioner av Chrome och Opera för­hind­rar phishing-attacker som dessa genom att visa ACE-strängen istället för den in­ter­na­tio­na­li­se­ra­de domänen på IDN:er som blandar tecken från olika tec­ken­upp­sätt­ning­ar. Internet Explorer och Microsoft Edge för­hind­rar åtkomst till domäner som dessa. Firefox erbjuder dock inget skydd mot Punycode-phishing.

Bild: 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­nishingly similar to the ASCII character a.

Så här kan Firefox-användare skydda sig. För att minska risken med phishing­webb­plat­ser har Firefox-användare för när­va­ran­de endast möjlighet att förhindra att Punycode översätts till IDN i allmänhet. Det krävs endast två steg för denna till­fäl­li­ga lösning:

  1. Öppna kon­fi­gu­ra­tions­re­di­ge­ra­ren: Skriv about:config i adress­fäl­tet i din webb­lä­sa­re för att öppna Firefox kon­fi­gu­ra­tions­re­di­ge­ra­re.
  2. Tvinga Punycode: Leta reda på in­ställ­ning­en network.IDN_show_punycode och ändra dess värde från false till true.

Efter kon­fi­gu­ra­tio­nen kommer Firefox att visa in­ter­na­tio­na­li­se­ra­de domäner i adress­fäl­tet som ACE-strängar.

Gå till huvudmeny