Punycode ir stan­dar­ti­zē­ta kodēšanas metode, kas ļauj Unicode rakstzī­mes attēlot, iz­man­to­jot ie­ro­be­žo­tu ASCII rakstzīm­ju kopu, kas nozīmē, ka star­ptau­tis­ka­jos domēnu vārdos (IDN) var iekļaut arī ne-ASCII rakstzī­mes, piemēram, umlautus.

Kā tika iz­strā­dā­ta šī kodēšanas metode?

2003. gadā Interneta in­že­nie­ri­jas darba grupa (IETF) stan­dar­ti­zē­ja Punycode kā sintaksi star­ptau­tis­ko domēnu vārdu kodēšanai lie­to­jum­prog­ram­mās (IDNA). IETF definē domēna vārdu kā IDN, ja tas satur īpašus simbolus, piemēram, diak­ri­tis­kos zīmes, burtus vai simbolus, kas nav sastopami latīņu alfabētā (piemēram, umlauti vācu valodā). Šādus simbolus nevar apstrādāt ar pamata pro­to­ko­liem, piemēram, domēna vārdu sistēmu (DNS). Šajā piemērā iz­man­to­sim domēna vārdu vācu valodā. Lai gan pēc IDN ie­vie­ša­nas vārds müller-büromöbel (Müllera biroja mēbeles) ir atļauts augstākā līmeņa domēnā .de, to var apstrādāt tikai, kodējot nebāzes rakstzī­mes, piemēram, vārda at­ri­si­nā­ša­nas kontekstā. Daudzi interneta protokoli ir balstīti uz angļu valodu un tādēļ atbalsta tikai ie­ro­be­žo­to ASCII rakstzīm­ju kopu.

Lai no­dro­ši­nā­tu IDN saderību ar vecākiem interneta stan­dar­tiem, IETF ir noteikusi metodi, kā kodēt in­ter­na­cio­na­li­zē­tus domēnu vārdus, iz­man­to­jot rakstzī­mes, kas jau bija atļautas. Šī stan­dar­ti­zē­tā kodēšanas procedūra ir pazīstama kā Punycode.

Note

E-pasta adresēs Punycode tiek izmantots tikai star­ptau­tis­ka­jiem e-pasta domēniem. Ja vietējā daļa (pirms simbolu @) satur ne-ASCII rakstzī­mes, tā tiek kodēta, iz­man­to­jot UTF-8.

Kā darbojas Punycode kodēšana?

Punycode procesa pārskats

IETF RFC 3492 dokumentā Punycode ir definēts kā viens no vispārējā kodēšanas algoritma, kas pazīstams kā Bootstring, ie­spē­ja­ma­jiem pie­lie­to­ju­miem. Bootstring algoritms ļauj attēlot rakstzīm­ju virknes, kas sastāv no jebkādiem rakstzīm­ju kopumiem, iz­man­to­jot ie­ro­be­žo­tu elementu klāstu. Kodēšanas metodes izstrāde balstās uz sešiem prin­ci­piem. Punycode kodējumā šos elementus sauc par bāzes rakstzī­mēm, kas sastāv no mazajiem burtiem, cipariem un defises (-). Kodēšanas metodes izstrāde balstās uz sešiem prin­ci­piem.

  • Pilnīgums: Katru izvades virkni var attēlot kā vien­kār­šo­tu virkni, iz­man­to­jot sākuma virkni.
  • Uni­ka­li­tā­te: Izvades virknes pie­šķir­ša­na at­tie­cī­ga­jai Bootstring kodējumam ir unikāla. Katram Punycode var piešķirt tieši vienu ASCII ek­vi­va­len­tu un otrādi.
  • Ap­grie­ža­mī­ba: Bootstring kodējumu var jebkurā brīdī atgriezt bez in­for­mā­ci­jas zuduma.
  • Efek­ti­vi­tā­te: Kodētā virkne ir – ja vispār – tikai nedaudz garāka par izvades virkni.
  • Vien­kār­šī­ba: Bootstring izmanto vien­kār­šus kodēšanas un de­ko­dē­ša­nas al­go­ritmus.
  • Lasāmība: tiek kodēti tikai tie simboli, kurus nevar attēlot mērķa simbolu kopā. Visi pārējie simboli paliek nemainīgi.

Punycode definē Bootstring at­bil­sto­ši star­ptau­tis­ko domēnu vārdu prasībām. Tas ļauj Unicode rakstzī­mes pārveidot, iz­man­to­jot iepriekš atļautās bāzes rakstzī­mes.

Punycode piemērs

Šis piemērs parāda, kā darbojas kodēšana:

IDN: müller-biroja mēbeles

IDN „müller-büromöbel“ satur burtus „ü“ un „ö“, kas nav iekļauti iepriekš atļautajā domēnu nosaukumu burtu kopā. Tāpēc, lai no­dro­ši­nā­tu saderību, tie ir jākodē, iz­man­to­jot Punycode.

1. solis: Nor­ma­li­zā­ci­ja

Pirmajā posmā kodēšanas process nodrošina izvades rakstzīm­ju virknes nor­ma­li­zē­ša­nu. Visas lielās burtu zīmes tiek aizstātas ar at­bil­sto­ša­jām mazajām burtu zīmēm.

2. solis: Visu ne-pa­mat­bur­ti­ņu izņemšana

Otrajā posmā tiek izslēgti visi ne-pa­mat­bur­ti. Pēc tam tie tiek pie­vie­no­ti domēna vārdam kodētā veidā un atdalīti ar defisi.

Ja interneta adrešu kodēšanai tiek izmantota Punycode sintakse, katrai rezultāta virknei tiek pie­vie­nots ACE prefikss (sa­īsi­nā­jums no ASCII-saderīgā kodējuma):

ACE prefikss: xn–

Priekš­vārds „ACE” nodrošina, ka domēna vārdus, kuros ir defises, neuzskata par star­ptau­tis­kiem domēna vārdiem.

Rezultātā IDN „müller-büromöbel“ tiek kodēts šādi:

ACE: xn–mller-brombel-rmb4fg

Punycode pro­ce­dū­ras pamatā esošais algoritms ir ie­vē­ro­jams. Tas nodrošina, ka, ne­rau­go­ties uz kon­ver­tē­ša­nu, domēna nosaukumi ne­pār­sniedz maksimālo garumu – 63 rakstzī­mes.

Kodēšanas procesa laikā Unicode rakstzī­mes netiek pār­vēr­stas ASCII rakstzī­mēs attiecībā 1:1. Tā vietā algoritms nosaka virkni, pa­ma­to­jo­ties uz attālumu starp dzēstajām rakstzī­mēm un rakstzīm­ju pozīciju izvades virknē.

Saistībā ar iepriekš parādīto piemēru teksta virkne „rmb4fg“ norāda, ka vārdam „mller-brombel“ otrajā un septītajā pozīcijā jā­pie­vie­no Unicode rakstzī­mes „ü“ un „ö “.

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

Izņēmumi no noteikuma

Atkāpes rodas, ja domēna vārdā nav neviena bāzes rakstzī­mes vai ja tajā ir tikai bāzes rakstzī­mes.

Domēna vārdam, kurā ir tikai ne-bāzes rakstzī­mes, pēc kodēšanas tiek parādīta tikai kodētā virkne un ACE prefikss. Domēna vārdam, piemēram, „παράδειγμα“ (grieķu valodā „piemērs“), atbilst šāda kodējuma:

IDN: piemērs

ACE: xn–hxajbheg2az3al

Ja domēna vārdā ir tikai standarta rakstzī­mes, Punycode netiek izmantots. Tādējādi netiek pie­vie­nots nekāds ACE prefikss. Šajā gadījumā kodēšana nav ne­pie­cie­ša­ma, jo standarta interneta protokoli jau spēj atpazīt šo domēna vārdu.

Ja pilnībā kva­li­fi­cē­to domēna vārdu (FQDN) aplūko kā vienotu veselumu, katra daļa (augstākā līmeņa domēns, otrā līmeņa domēns, trešā līmeņa domēns utt.) tiek kodēta atsevišķi. Domēnspiemēram.bg (bulgāru valodā „example.bg“) varētu tikt kodēts šādi

IDN: piemērs.bg

ACE: xn–e1afmkfd.xn–90ae

Turp­mā­ka­jā tabulā ir sniegts pārskats par da­žā­da­jiem Punycode sintakses va­rian­tiem.

IDN Punycode ACE
Bāzes un nebāzes rakstzī­mes müller-büromöbel.de mller-brombel-rmb4fg.de xn--mller-brombel-rmb4fg.de
Tikai ne-bāzes rakstzī­mes Παράδειγμα.gr hxajbheg2az3al.gr xn--hxajbheg2az3al.gr
Tikai bāzes rakstzī­mes example.org example.org Nav liet­de­rī­gi
Note

Punycode algoritms ir sīki ap­rak­stīts RFC 3492. Turklāt šajā dokumentā ir sniegta kodēšanas pro­ce­dū­ras īs­te­no­ša­na prog­ram­mē­ša­nas valodā C.

Lietotāji parasti izmanto bezmaksas Punycode kon­ver­tē­tā­jus, lai kodētu star­ptau­tis­kos domēnu vārdus.

Vājš kodējums ar emodži domēniem

Ar Punycode palīdzību var realizēt ne tikai in­ter­na­cio­na­li­zē­tus domēnu vārdus, bet arī emodži domēnus. Tomēr, lai tas darbotos, augstākā līmeņa domēnam ir jāatļauj emodžu iz­man­to­ša­na, un vēlamajam emodžim ir jāatbilst Unicode stan­dar­tam.

Tip

Pašlaik šādos augstākā līmeņa domēnos ir iespējams reģistrēt domēnus ar emodžiem: .ws, .tk, .to, .ml, .ga, .cf, .gq un .fm.

Emoji domēni tehniski tiek ap­strā­dā­ti kā Punycode, taču teo­rē­tis­ki lie­to­tā­jam tie būtu jāparāda kā teksta un emo­cijzīm­ju kom­bi­nā­ci­ja.

Emoji domēns: https://i❤.ws/

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

Pašlaik praktiski neviena standarta pār­lūkprog­ram­ma to neīsteno. Ja Firefox, Chrome, Safari, Edge vai Opera pār­lūkprog­ram­mā ievadāt emodži domēnu, adreses joslā tiek parādīta tikai ACE virkne.

Vai ir pieejami bezmaksas Punycode kon­ver­tē­tā­ji?

Dažādās tīmekļa vietnēs ir pieejami bezmaksas Punycode ģe­ne­ra­to­ri, kas pārvērš IDN adreses ASCII formātā. Viens no piemēriem ir Punycoder.

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

Citu augšējā līmeņa domēnu IDN gadījumā laba izvēle ir Mathias Bynens iz­strā­dā­tais Punycode kon­ver­tē­tājs, kas balstās uz punycode.js.

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.

Vai Punycode rada drošības risku?

Punycode kļūst par drošības risku ho­mog­rā­fis­kā pikšķe­rē­ša­nas gadījumā – ki­be­ruz­bru­ku­mos, kuros no­ziedz­nie­ki izmanto dažādu rakstzīm­ju vizuālo līdzību, lai pie­vi­li­nā­tu neko ne­no­jau­šus upurus uz viltus tīmekļa vietnēm. Blogeris Xudong Zheng parāda, kā izskatās pikšķe­rē­ša­nas uzbrukums, iz­man­to­jot par piemēru šādu Punycode domēnu: https://www.xn--80ak6aa92e.com/. Tas novirza interneta lie­to­tā­jus uz tīmekļa vietni ar šādu IDN: https://www.аррӏе.com/

Norādītā URL adrese nav Ka­li­for­ni­jas teh­no­lo­ģi­ju uzņēmuma „Apple Inc.“ oficiālā tīmekļa vietne, bet gan pikšķe­rē­ša­nas tīmekļa vietne, kas izveidota de­mons­trā­ci­jas nolūkos.

ASCII rakstzī­mes „a“ (U+0061) vietā tiek izmantota kirilicā rakstītā „а“ (U+0430) – šīs divas rakstzī­mes ar ne­ap­bru­ņo­tu aci gandrīz nav at­šķi­ra­mas, taču tīmekļa pārlūki tās in­ter­pre­tē kā at­šķi­rī­gas rakstzī­mes. Pat ser­ti­fi­kā­ti nespēj no­dro­ši­nāt drošību, lai aiz­sar­gā­tu interneta lie­to­tā­jus. Mūsdienu pikšķe­rē­ša­nas kampaņās no­ziedz­nie­ki izveido derīgus SSL ser­ti­fi­kā­tus, lai padarītu savas tīmekļa vietnes au­ten­tis­kas.

Pa­šrei­zē­jās „Chrome“ un „Opera“ versijas novērš šādus pikšķe­rē­ša­nas uz­bru­ku­mus, IDN domēnos, kuros ir sajaukti dažādu rakstzīm­ju kopu simboli, parādot ACE virkni, nevis in­ter­na­cio­na­li­zē­to domēna nosaukumu. „Internet Explorer“ un „Microsoft Edge“ neļauj piekļūt šādiem domēniem. Savukārt „Firefox“ ne­nod­ro­ši­na nekādu aiz­sar­dzī­bu pret Punycode pikšķe­rē­ša­nu.

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.

Tā Firefox lietotāji var sevi pasargāt. Lai sa­ma­zi­nā­tu risku, ko rada pikšķe­rē­ša­nas vietnes, Firefox lie­to­tā­jiem pašlaik ir pieejama tikai iespēja vispār neļaut Punycode pārvērst IDN. Šim pagaidu ri­si­nā­ju­mam ir ne­pie­cie­ša­mi tikai divi soļi:

  1. Atveriet kon­fi­gu­rā­ci­jas redaktoru: ievadiet tīmekļa pārlūka adreses joslā about:config, lai atvērtu Firefox kon­fi­gu­rā­ci­jas redaktoru.
  2. Pie­spie­diet Punycode: Atrodiet ie­sta­tī­ju­mu network.IDN_show_punycode un mainiet tā vērtību no false uz true.

Pēc kon­fi­gu­rē­ša­nas Firefox adreses joslā star­ptau­tis­kos domēnus attēlos kā ACE virknes.

Go to Main Menu