Punycode er en standardisert kodingsmetode som gjør det mulig å gjengi Unicode-tegn ved hjelp av et begrenset ASCII-tegnsett, noe som betyr at internasjonaliserte domenenavn (IDN) også kan inneholde ikke-ASCII-tegn, for eksempel omlydstegn.

Hvordan ble kodingsmetoden utviklet?

I 2003 ble Punycode standardisert av Internet Engineering Task Force (IETF) som syntaks for koding av internasjonalisert domenenavn i applikasjoner (IDNA). IETF definerer et domenenavn som et IDN hvis det inneholder spesialtegn som diakritiske tegn, bokstaver eller tegn som ikke finnes i det latinske alfabetet (f.eks. omlydstegn på tysk). Slike tegn kan ikke behandles av grunnleggende protokoller som Domain Name System (DNS). I dette eksemplet bruker vi et domenenavn på tysk. Selv om müller-büromöbel (Müllers kontormøbler) er tillatt under toppdomenet .de etter innføringen av IDN-er, kan det bare behandles ved å kode de ikke-baserte tegnene, for eksempel i sammenheng med navneløsning. Mange internettprotokoller er basert på engelsk og støtter derfor bare det begrensede ASCII-tegnsettet.

For å sikre kompatibilitet mellom IDN-er og eldre internettstandarder har IETF fastsatt en metode for koding av internasjonaliserte domenenavn ved hjelp av tegn som allerede var tillatt. Denne standardiserte kodingsprosedyren kalles Punycode.

Note

Når det gjelder e-postadresser, brukes Punycode kun for internasjonalisert e-postdomener. Hvis den lokale delen (før @-tegnet) inneholder tegn som ikke er ASCII-tegn, kodes den ved hjelp av UTF-8.

Hvordan fungerer Punycode-koding?

En oversikt over Punycode-prosessen

Punycode er definert av IETF i RFC 3492 som en mulig anvendelse av den generelle kodingsalgoritmen kjent som Bootstring. Bootstring-algoritmen gjør det mulig å tilordne tegnstrenger som består av vilkårlige tegnsett til et begrenset utvalg av elementer. Utviklingen av kodingsprosedyren er basert på seks prinsipper. I Punycode-koding kalles disse elementene basistegn, som består av små bokstaver, tall og bindestrek (-). Utviklingen av kodingsmetoden er basert på seks prinsipper.

  • Fullstendighet: Hver utdatastreng kan tilordnes en forenklet streng ved hjelp av en boot-streng.
  • Unikhet: Tilordningen av utgangsstrengen til den respektive Bootstring-kodingen er unik. Hver Punycode kan tilordnes nøyaktig én ASCII-motpart og omvendt.
  • Reversibilitet: En Bootstring-koding kan reverseres når som helst uten tap av informasjon.
  • Effektivitet: Den kodede strengen er – om i det hele tatt – bare minimalt lengre enn utdatastrengen.
  • Enkelhet: Bootstring bruker enkle kodings- og dekodingsalgoritmer.
  • Lesbarhet: Kun tegn som ikke kan representeres i måletegnsettet blir kodet. Alle andre tegn forblir uendret.

Punycode definerer Bootstring i henhold til kravene til internasjonaliserte domenenavn. Dette skal gjøre det mulig å tilordne Unicode-tegn via de tidligere godkjente basistegnene.

Eksempel på Punycode

Følgende eksempel viser hvordan kodingen fungerer:

IDN: müller-kontormøbler

IDN-domenet «müller-büromöbel» inneholder tegnene ü og ö, som ikke inngår i det tidligere tillatte tegnsettet for domenenavn. Derfor må de kodes via Punycode for å sikre kompatibilitet.

Trinn 1: Normalisering

I det første trinnet sørger kodingsprosessen for at den utgående tegnstrengen normaliseres. Alle store bokstaver erstattes med tilsvarende små bokstaver.

Trinn 2: Fjerning av alle tegn som ikke er grunnleggende

I det andre trinnet fjernes alle tegn som ikke er grunnleggende. Disse legges deretter til domenenavnet i kodet form og skilles med en bindestrek.

Hvis Punycode-syntaksen brukes til å kode nettadresser, får hver resultatstreng et ACE-prefiks (forkortelse for ASCII-kompatibel koding):

ACE-prefiks: xn–

ACE-prefikset sikrer at domenenavn som inneholder bindestreker ikke feiltolkes som internasjonale domenenavn.

Dette gir følgende koding for IDN-navnet «müller-büromöbel»:

ACE: xn–mller-brombel-rmb4fg

Algoritmen som ligger til grunn for Punycode-prosessen, er bemerkelsesverdig. Den sikrer at domenenavnene, til tross for konverteringen, ikke overskrider den maksimale lengden på 63 tegn.

Under kodingsprosessen konverteres ikke Unicode-tegn én-til-én til ASCII-tegn. I stedet beregner algoritmen en streng basert på avstanden mellom de slettede tegnene og tegnene i utdatastrengen.

I forbindelse med eksemplet ovenfor angir strengen rmb4fg at mller-brombel må suppleres med Unicode-tegnene ü og ö på henholdsvis andre og syvende plass.

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

Unntak fra regelen

Det oppstår avvik hvis domenenavnet ikke inneholder noen tegn som ikke tilhører grunnsettet, eller hvis det kun inneholder tegn som ikke tilhører grunnsettet.

Et domenenavn som kun inneholder tegn som ikke er grunntegn, viser bare den kodede strengen og ACE-prefikset etter at det er kodet. Et domenenavn som «παράδειγμα» (gresk for «eksempel») tilsvarer følgende koding:

IDN: eksempel

ACE: xn–hxajbheg2az3al

Hvis et domenenavn kun inneholder standardtegn, brukes ikke Punycode. Følgelig legges det ikke til noe ACE-prefiks. Koding er ikke nødvendig i dette tilfellet, siden grunnleggende internettprotokoller allerede kan tolke domenenavnet.

Hvis man ser på det fullstendige domenenavnet (FQDN) som en helhet, blir hver del (toppnivådomene, andrenivådomene, tredjenivådomene osv.) kodet separat. Et domenesom пример.бг (bulgarsk for «example.bg») kan kodes på følgende måte

IDN: eksempel.bg

ACE: xn–e1afmkfd.xn–90ae

Tabellen nedenfor gir en oversikt over de ulike variantene av Punycode-syntaksen.

IDN Punycode ACE
Baserte og ikke-baserte tegn müller-büromöbel.de mller-brombel-rmb4fg.de xn--mller-brombel-rmb4fg.de
Kun ikke-baserte tegn Παράδειγμα.gr hxajbheg2az3al.gr xn--hxajbheg2az3al.gr
Kun basistegn example.org example.org Ingen bruk
Note

Punycode-algoritmen er beskrevet i detalj i RFC 3492. I tillegg inneholder dokumentet en implementering av kodingsprosedyren i programmeringsspråket C.

Brukere benytter seg vanligvis av gratis tilgjengelige Punycode-konvertere for å kode internasjonalisert domenenavn.

Enkel koding med emoji-domener

Ikke bare internasjonaliserte domenenavn, men også emoji-domener kan realiseres via Punycode. For at dette skal fungere, må imidlertid toppdomenet tillate bruk av emoji-tegn, og det ønskede emoji-tegnet må være i Unicode-standarden.

Tip

For øyeblikket tillater følgende toppdomener registrering av emoji-domener: .ws, .tk, .to, .ml, .ga, .cf, .gq og .fm.

Emoji-domener behandles teknisk sett som Punycode, men bør i teorien vises for brukeren som en kombinasjon av tekst og uttrykksikoner.

Emoji-domene: https://i❤.ws/

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

Foreløpig er det praktisk talt ingen standardnettlesere som støtter dette. Hvis du skriver inn et emoji-domene i Firefox, Chrome, Safari, Edge eller Opera, viser adressefeltet bare ACE-strengen.

Finnes det gratis Punycode-konverterere?

Det finnes gratis Punycode-generatorer som konverterer IDN-adresser til et ASCII-kompatibelt format på ulike nettsteder. Et eksempel er Punycoder.

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

For IDN-er under andre toppdomener er Punycode-konverteren av Mathias Bynens, basert på punycode.js, et godt valg.

Image: 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 converting internationalised domains.

Utgjør Punycode en sikkerhetsrisiko?

Punycode utgjør en sikkerhetsrisiko ved homografisk phishing – nettangrep der kriminelle utnytter at ulike tegn ser like ut for å lokke intetanende ofre til falske nettsteder. Bloggeren Xudong Zheng viser hvordan et phishing-angrep ser ut ved å ta følgende Punycode-domene https://www.xn--80ak6aa92e.com/ som eksempel. Dette fører nettbrukere til et nettsted med følgende IDN: https://www.аррӏе.com/

Den oppgitte nettadressen er ikke den offisielle nettsiden til det kaliforniske teknologiselskapet Apple Inc., men et phishing-nettsted som er opprettet for demonstrasjonsformål.

I stedet for ASCII-tegnet «a» med Unicode-koden U+0061 brukes det kyrilliske tegnet «а» (U+0430) – disse to tegnene er nesten umulige å skille fra hverandre med det blotte øye, men tolkes som forskjellige tegn av nettlesere. Selv sertifikater kan ikke garantere sikkerhet for internettbrukere. I moderne phishing-kampanjer oppretter kriminelle gyldige SSL-sertifikater med det formål å få nettstedene sine til å virke autentiske.

Nåværende versjoner av Chrome og Opera forhindrer slike phishing-angrep ved å vise ACE-strengen i stedet for det internasjonaliserte domenenavnet på IDN-er som inneholder tegn fra ulike tegnsett. Internet Explorer og Microsoft Edge hindrer tilgang til slike domener. Firefox tilbyr derimot ingen beskyttelse mot Punycode-phishing.

Image: Example of a homographic attack
Example of a homographic domain: The URL looks the same as Apple’s official website, however, the Unicode character U+0430 is actually a Cyrillic letter that is astonishingly similar to the ASCII character a.

Slik kan Firefox-brukere beskytte seg. For å redusere risikoen forbundet med phishing-nettsteder har Firefox-brukere foreløpig bare muligheten til å forhindre at Punycode oversettes til IDN-adresser generelt. Denne midlertidige løsningen krever bare to trinn:

  1. Åpne konfigurasjonsredigereren: Skriv inn about:config i adressefeltet i nettleseren din for å åpne konfigurasjonsredigereren i Firefox.
  2. Tving Punycode: Finn innstillingen network.IDN_show_punycode og endre verdien fra false til true.

Etter konfigurasjonen vil Firefox vise internasjonalisert domener i adressefeltet som ACE-strenger.

Go to Main Menu