Punycode on stan­dar­di­tud ko­dee­ri­mis­mee­tod, mis võimaldab Unicode-märkide esituseks kasutada piiratud ASCII-mär­gis­tikku, mis tähendab, et rah­vus­va­he­li­sed do­mee­nini­med (IDN) võivad sisaldada ka mitte-ASCII-märke, näiteks üla­kriipse.

Kuidas töötati välja see ko­dee­ri­mis­mee­tod?

2003. aastal stan­dar­di­see­ris Internet En­gi­nee­ring Task Force (IETF) Punycode’i kui süntaksi rah­vus­va­he­liste do­mee­nini­mede ko­dee­ri­miseks ra­ken­dus­tes (IDNA). IETF määratleb do­mee­ninime IDN-ina, kui see sisaldab erimärke, nagu diakrii­ti­li­sed märgid, tähed või märgid, mida ladina tä­hes­ti­kus ei leidu (nt saksa keele üla­kriip­sud). Selliseid märke ei saa töödelda põ­hi­pro­to­kol­li­dega, nagu do­mee­nini­mede süsteem (DNS). Selles näites kasutame saksa keeles do­mee­ninime. Kuigi IDN-ide ka­su­tuse­le­võtu järel on müller-büromöbel (Mülleri kontori mööbel) lubatud tipp­do­meeni .de all, saab seda töödelda ainult mitte-baas­mär­kide ko­dee­ri­mise abil, näiteks nime la­hen­da­mise kon­teks­tis. Paljud in­ter­ne­ti­pro­to­kol­lid põhinevad inglise keelel ja toetavad seetõttu ainult piiratud ASCII-mär­gis­tikku.

Selleks et tagada IDN-ide ja vanemate in­ter­ne­t­i­stan­dar­dite ühilduvus, on IETF keh­tes­ta­nud meetodi rah­vus­va­he­liste do­mee­nini­mede ko­dee­ri­miseks, kasutades selleks juba lubatud märke. Seda stan­dar­di­see­ri­tud ko­dee­ri­mis­prot­se­duuri tuntakse ni­me­tu­sega Punycode.

Note

E-posti aad­res­side puhul ka­su­ta­takse Punycode’i ainult rah­vus­va­he­liste e-posti domeenide korral. Kui kohalik osa (märgi @ ees) sisaldab mitte-ASCII-märki, ko­dee­ri­takse see UTF-8-i abil.

Kuidas toimib Punycode’i ko­dee­ri­mine?

Ülevaade Punycode’i prot­sessist

IETF on RFC 3492-s mää­rat­le­nud Punycode’i kui üldise koo­di­mis­algo­ritmi, mida tuntakse ni­me­tu­sega Bootst­ring, ühe võimaliku rakenduse. Bootst­ring-algoritm võimaldab kaar­dis­tada mär­gi­ja­da­sid, mis koosnevad su­valis­test mär­gis­ti­ku­test, kasutades piiratud hulka elemente. Koo­di­mis­prot­se­duuri väl­ja­töö­ta­mine põhineb kuuel põ­hi­mõt­tel. Punycode’i ko­dee­ri­misel ni­me­ta­takse neid elemente baas­mär­ki­deks, mis koosnevad väi­ke­täh­te­dest, numb­ri­test ja si­de­kriipsust (-). Ko­dee­ri­mis­mee­todi väl­ja­töö­ta­mine põhineb kuuel põ­hi­mõt­tel.

  • Täie­lik­kus: Iga väl­jundst­ringi saab boot-stringi abil seostada liht­sus­ta­tud stringiga.
  • Uni­kaal­sus: Väl­jundst­ringi seos­ta­mine vastava bootst­ringi ko­dee­rin­guga on unikaalne. Iga Punycode’ile saab määrata täpselt ühe ASCII-vastet ja vastupidi.
  • Pöörduvus: Bootst­ring-ko­dee­rin­gut saab igal ajal pöörata ilma teabe kaotuseta.
  • Tõhusus: ko­dee­ri­tud string on – kui üldse – väl­jundst­rin­gist vaid mi­ni­maal­selt pikem.
  • Lihtsus: Bootst­ring kasutab lihtsaid ko­dee­ri­mis- ja de­ko­dee­ri­mis­algo­ritme.
  • Loetavus: Ko­dee­ri­takse ainult need tä­he­mär­gid, mida siht­mär­gis­ti­kus ei ole võimalik esitada. Kõik ülejäänud tä­he­mär­gid jäävad muu­tu­ma­tuks.

Punycode määratleb Bootst­ringi vastavalt rah­vus­va­he­liste do­mee­nini­mede nõuetele. See peaks või­mal­dama Unicode-märkide kaar­dis­ta­mist varem lubatud baas­mär­kide kaudu.

Punycode’i näide

Järgmine näide näitab, kuidas ko­dee­ri­mine toimib:

IDN: Müller-Büromöbel

IDN-domeenis „müller-büromöbel“ esinevad tä­he­mär­gid „ü“ ja „ö“, mida varem do­mee­nini­mede jaoks lubatud tä­he­mär­kide hulka ei kuulunud. Seetõttu tuleb need ühil­du­vuse ta­ga­miseks kodeerida Punycode’i abil.

1. samm: Nor­ma­li­see­ri­mine

Esimeses etapis võimaldab ko­dee­ri­mis­prot­se­duur väl­jund­mär­gi­jada nor­ma­li­see­rida. Kõik suurtähed asen­da­takse vastavate väi­ke­täh­te­dega.

2. samm: Kõigi mitte-põ­hi­täh­tede eemal­da­mine

Teises etapis eemal­da­takse kõik mitte-põhitähed. Need lisatakse seejärel do­mee­nini­mele ko­dee­ri­tud kujul ja eral­da­takse si­de­kriip­suga.

Kui in­ter­ne­tiaad­res­side ko­dee­ri­miseks ka­su­ta­takse Punycode’i süntaksit, lisatakse igale tu­le­musst­rin­gile eesliide ACE (lühend sõnadest ASCII-com­pa­tible encoding):

ACE-eesliide: xn–

Eesliide „ACE“ tagab, et si­de­kriip­su­dega do­mee­nini­me­sid ei tõl­gen­da­taks ekslikult rah­vus­va­he­liste do­mee­nini­me­dena.

Selle tu­le­mu­sena on IDN-i „müller-büromöbel“ kood järgmine:

ACE: xn–mller-brombel-rmb4fg

Punycode’i prot­se­duuri aluseks olev algoritm on tä­he­le­pa­nu­väärne. See tagab, et hoolimata tei­sen­da­mi­sest ei ületa do­mee­nini­med mak­si­maal­set pikkust, mis on 63 tähemärki.

Ko­dee­ri­mise käigus ei tei­sen­data Unicode-märke üks ühele ASCII-märkideks. Selle asemel määrab algoritm märgijada kindlaks, lähtudes kus­tu­ta­tud märkide va­he­kau­gu­sest ja märkide asukohast väl­jund­ja­das.

Eespool toodud näite puhul tähendab string rmb4fg, et mller-brombel tuleb täiendada Unicode-märkidega ü ja ö teisel ja seits­men­dal kohal.

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

Erandid reeglist

Kõr­va­le­kal­ded tekivad juhul, kui do­mee­ni­nimi ei sisalda ühtegi põhitähte või kui see sisaldab ainult põhitähte.

Do­mee­ni­nimi, mis sisaldab ainult mitte-baasmärke, kuvab pärast ko­dee­ri­mist ainult ko­dee­ri­tud stringi ja ACE-eelneva. Do­mee­ni­nimi nagu παράδειγμα (kreeka keeles „näide”) vastab järg­misele ko­dee­rin­gule:

IDN: näide

ACE: xn–hxajbheg2az3al

Kui do­mee­ni­nimi sisaldab ainult põhitähte, siis Punycode’i ei kasutata. Seega ei lisata ka ACE-eelnevat. Sellisel juhul ei ole ko­dee­ri­mine vajalik, kuna põhilised in­ter­ne­ti­pro­to­kol­lid suudavad do­mee­ninime juba mõista.

Kui vaadelda täielikku do­mee­ninime (FQDN) tervikuna, ko­dee­ri­takse iga osa (tipp­do­meen, teise taseme domeen, kolmanda taseme domeen jne) eraldi. Domeennagu пример.бг (bulgaaria keeles „example.bg“) võiks olla ko­dee­ri­tud järg­mi­selt

IDN: näide.bg

ACE: xn–e1afmkfd.xn–90ae

Järgmine tabel annab ülevaate Punycode’i süntaksi eri­ne­va­test va­rian­ti­dest.

IDN Punycode ACE
Põhi- ja mit­te­põ­hi­tä­hed müller-büromöbel.de mller-brombel-rmb4fg.de xn--mller-brombel-rmb4fg.de
Ainult mitte-baas­mär­gid Παράδειγμα.gr hxajbheg2az3al.gr xn--hxajbheg2az3al.gr
Ainult baas­mär­gid example.org example.org Ei kasuta
Note

Punycode’i algoritmi kir­jel­da­takse ük­sik­as­ja­li­kult do­ku­men­dis RFC 3492. Lisaks sisaldab dokument koo­di­mis­prot­se­duuri rakendust prog­ram­mee­ri­mis­kee­les C.

Kasutajad kasutavad rah­vus­va­he­liste do­mee­nini­mede ko­dee­ri­miseks ta­va­li­selt tasuta kät­te­saa­da­vaid Punycode-kon­ver­te­reid.

Puny-kodeering koos emo­ji­do­mee­ni­dega

Punycode’i abil on võimalik luua mitte ainult rah­vus­va­he­lisi do­mee­nini­me­sid, vaid ka emo­ji­do­meene. Selleks peab aga tipp­do­meen lubama emojide ka­su­ta­mist ning soovitud emotikon peab olema Unicode’i stan­dar­dis.

Tip

Praegu on emo­ji­do­mee­nide re­gist­ree­ri­mine lubatud järg­mis­tes tipp­do­mee­ni­des: .ws, .tk, .to, .ml, .ga, .cf, .gq ja .fm.

Emoji-domeene töö­del­dakse teh­ni­li­selt Punycode’ina, kuid teo­ree­ti­li­selt peaksid need ka­su­tajale kuvatama teksti ja emo­ti­ko­nide kom­bi­nat­sioo­nina.

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

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

Praegu ei toeta seda prak­ti­li­selt ükski tavaline vee­bib­rau­ser. Kui sisestad emo­ji­do­meeni Firefoxis, Chromes, Safaris, Edges või Operas, kuvatakse aad­res­si­ri­bale ainult ACE-string.

Kas on olemas tasuta Punycode’i tei­sen­da­jaid?

Mitmetel vee­bi­sai­ti­del on saadaval tasuta Punycode-ge­ne­raa­to­rid, mis tei­sen­da­vad IDN-d ASCII-ga ühil­du­vasse vormi. Üks näide on Punycoder.

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

Muude tipp­do­mee­nide IDN-ide puhul on hea valik Mathias Bynensi punycode.js -il põhinev Punycode-konverter.

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 con­ver­ting in­ter­na­tio­na­li­sed domains.

Kas Punycode kujutab endast tur­va­riski?

Punycode kujutab endast tur­va­riski ho­mog­raa­fi­lise phishing’u puhul – see on kü­ber­rün­nak, mille käigus kur­ja­te­gi­jad kasutavad erinevate tähtede sarnast välimust, et meelitada pa­haa­i­ma­ma­tuid ohvreid võltsitud vee­bi­sai­ti­dele. Blogija Xudong Zheng näitab, kuidas selline phishing-rünnak välja näeb, tuues näiteks järgmise Punycode-domeeni: https://www.xn--80ak6aa92e.com/. See suunab in­ter­ne­ti­ka­su­ta­jad vee­bi­sai­dile, millel on järgmine IDN: https://www.аррӏе.com/

Esitatud vee­biaad­ress ei ole Ka­li­for­nia teh­no­loo­gia­et­te­võtte Apple Inc. ametlik veebisait, vaid näidiseks loodud pet­tus­vee­bi­sait.

ASCII-märgi „a“ (Unicode U+0061) asemel ka­su­ta­takse ki­ril­litsa tähte „а“ (U+0430) – neid kahte märki on palja silmaga peaaegu võimatu eristada, kuid vee­bib­rau­se­rid tõl­gen­da­vad neid erinevate märkidena. Isegi ser­ti­fi­kaa­did ei suuda tagada in­ter­ne­ti­ka­su­ta­jate tur­va­li­sust. Kaas­aeg­se­tes pet­tu­se­kam­paa­nia­tes loovad kur­ja­te­gi­jad kehtivaid SSL-ser­ti­fi­kaate, et muuta oma vee­bi­sai­did au­tent­sena näivaks.

Chrome’i ja Opera praegused ver­sioo­nid hoiavad ära selliseid pet­tus­rün­na­kuid, kuvades rah­vus­va­he­liste do­mee­nini­mede (IDN) puhul, mis si­sal­da­vad eri­ne­va­test tä­he­mär­gis­ti­ku­test pärit märke, rah­vus­va­he­lise do­mee­ninime asemel ACE-stringi. Internet Explorer ja Microsoft Edge ta­kis­ta­vad sel­lis­tele do­mee­ni­dele juur­de­pääsu. Firefox aga ei paku mingit kaitset Punycode-pettuste vastu.

Image: Example of a homographic attack
Example of a ho­mog­rap­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 as­to­nishingly similar to the ASCII character a.

Nii saavad Firefoxi kasutajad end kaitsta. Et vähendada pet­tus­vee­bi­sai­ti­dest tulenevat ohtu, on Firefoxi ka­su­ta­ja­tel praegu võimalik vaid üldiselt takistada Punycode’i tõlkimist IDN-idesse. Selle ajutise lahenduse ra­ken­da­miseks on vaja vaid kahte sammu:

  1. Avage seadete redaktor: sisestage vee­bib­rau­seri aad­res­si­ri­bale about:config, et avada Firefoxi seadete redaktor.
  2. Punycode’i ka­su­ta­mine: otsige seade network.IDN_show_punycode ja muudke selle väärtus false’ist true’iks.

Pärast sea­dis­ta­mist kuvab Firefox rah­vus­va­he­li­sed do­mee­nini­med aad­res­si­ri­bas ACE-strin­gi­dena.

Go to Main Menu