Kuinka muuntaa kansainvälistetyt verkkotunnukset Punycode-muotoon
Punycode on standardoitu koodausmenetelmä, jonka avulla Unicode-merkit voidaan esittää rajoitetulla ASCII-merkistöllä. Tämä tarkoittaa, että kansainvälistetyt verkkotunnukset (IDN) voivat sisältää myös muita kuin ASCII-merkkejä, kuten esimerkiksi umlauteja.
Miten koodausmenetelmä kehitettiin?
Vuonna 2003 Internet Engineering Task Force (IETF) standardoi Punycoden syntaksin kansainvälistettyjen verkkotunnusten koodaamiseen sovelluksissa (IDNA). IETF määrittelee verkkotunnuksen IDN:ksi, jos se sisältää erikoismerkkejä, kuten diakriittisiä merkkejä, kirjaimia tai merkkejä, joita ei löydy latinalaisesta aakkosesta (esim. saksan kielen umlautit). Tällaisia merkkejä ei voida käsitellä perusprotokollilla, kuten Domain Name System (DNS). Tässä esimerkissä käytämme saksankielistä verkkotunnusta. Vaikka IDN-tunnusten käyttöönoton jälkeen müller-büromöbel (Müllerin toimistokalusteet) on sallittu .de-tason verkkotunnuksessa, sitä voidaan käsitellä vain koodaamalla muut kuin perusmerkit, esimerkiksi nimien selvittämisen yhteydessä. Lukuisat internet-protokollat perustuvat englantiin ja tukevat siksi vain rajoitettua ASCII-merkistöä.
IDN-nimien ja vanhempien internetstandardien yhteensopivuuden varmistamiseksi IETF on määrittänyt menetelmän, jolla kansainvälistetyt verkkotunnukset koodataan käyttämällä jo aiemmin sallittuja merkkejä. Tätä standardoitua koodausmenettelyä kutsutaan nimellä Punycode.
Sähköpostiosoitteiden osalta Punycodea käytetään vain kansainvälistetyissä sähköpostitunnuksissa. Jos paikallinen osa (merkkiä @ edeltävä osa) sisältää muita kuin ASCII-merkkejä, se koodataan UTF-8-merkistöön.
Miten Punycode-koodaus toimii?
Yleiskatsaus Punycode-prosessiin
IETF on määritellyt Punycoden RFC 3492 -standardissa yhtenä mahdollisena sovelluksena yleiselle koodausalgoritmille, joka tunnetaan nimellä Bootstring. Bootstring-algoritmi mahdollistaa sellaisten merkkijonojen koodaamisen, jotka koostuvat mielivaltaisista merkistöistä, käyttäen rajoitettua valikoimaa elementtejä. Koodausmenettelyn kehittäminen perustuu kuuteen periaatteeseen. Punycode-koodauksessa näitä elementtejä kutsutaan perusmerkeiksi, jotka koostuvat pienistä kirjaimista, numeroista ja väliviivasta (-). Koodausmenetelmän kehittäminen perustuu kuuteen periaatteeseen.
- Täydellisyys: Jokainen tulostusmerkkijono voidaan liittää yksinkertaistettuun merkkijonoon boot-merkkijonon avulla.
- Ainutlaatuisuus: Tulostusmerkkijonon liittäminen vastaavaan käynnistysmerkkijonokoodaukseen on ainutlaatuista. Jokaiselle Punycode-merkille voidaan liittää täsmälleen yksi ASCII-vastaava ja päinvastoin.
- Käännettävyys: Bootstring-koodaus voidaan kääntää milloin tahansa ilman tietojen menetystä.
- Tehokkuus: Koodattu merkkijono on – jos ollenkaan – vain minimaalisesti pidempi kuin tulostusmerkkijono.
- Yksinkertaisuus: Bootstring käyttää yksinkertaisia koodaus- ja dekoodausalgoritmeja.
- Luettavuus: Vain merkit, joita ei voida esittää kohdemerkistössä, koodataan. Kaikki muut merkit pysyvät muuttumattomina.
Punycode määrittelee Bootstringin kansainvälistettyjä verkkotunnuksia koskevien vaatimusten mukaisesti. Tämän pitäisi mahdollistaa Unicode-merkkien muuntaminen aiemmin sallittujen perusmerkkien avulla.
Punycode-esimerkki
Seuraava esimerkki havainnollistaa, miten koodaus toimii:
IDN: müller-büromöbel
IDN-verkkotunnus „müller-büromöbel“ sisältää merkit ü ja ö, joita ei ole aiemmin sallitussa verkkotunnusten merkistössä. Tästä syystä ne on koodattava Punycode-muotoon yhteensopivuuden varmistamiseksi.
Vaihe 1: Normalisointi
Ensimmäisessä vaiheessa koodausprosessi mahdollistaa tulostettavan merkkijonon normalisoinnin. Kaikki isot kirjaimet korvataan vastaavilla pienillä kirjaimilla.
Vaihe 2: Kaikkien muiden kuin perusmerkkien poistaminen
Toisessa vaiheessa kaikki muut kuin perusmerkit poistetaan. Nämä lisätään sitten verkkotunnukseen koodatussa muodossa ja erotetaan toisistaan väliviivalla.
Jos Internet-osoitteiden koodaamiseen käytetään Punycode-syntaksia, jokaiselle tulosmerkkijonolle annetaan ACE-etuliite (lyhenne sanoista ASCII-compatible encoding):
ACE-etuliite: xn–
ACE-etuliite varmistaa, ettei väliviivoja sisältäviä verkkotunnuksia tulkita virheellisesti kansainvälisiksi verkkotunnuksiksi.
Tämän seurauksena IDN-tunnus “ müller-büromöbel“ koodataan seuraavasti:
ACE: xn–mller-brombel-rmb4fg
Punycode-menettelyn taustalla oleva algoritmi on vaikuttava. Se varmistaa, että muunnoksesta huolimatta verkkotunnusten pituus ei ylitä 63 merkin enimmäispituutta.
Koodausprosessin aikana Unicode-merkkejä ei muunneta yksi yhteen ASCII-merkeiksi. Sen sijaan algoritmi määrittää merkkijonon perustuen poistettujen merkkien väliseen etäisyyteen ja merkkien sijaintiin tulostusmerkkijonossa.
Edellä esitetyn esimerkin tapaan merkkijono rmb4fg tarkoittaa, että merkkijonoon mller-brombel on lisättävä Unicode-merkit ü ja ö toiseen ja seitsemänteen kohtaan.

Säännön poikkeukset
Poikkeamia esiintyy, jos verkkotunnuksessa ei ole lainkaan muita kuin perusmerkkejä tai jos se sisältää pelkästään muita kuin perusmerkkejä.
Vain muita kuin perusmerkkejä sisältävässä verkkotunnuksessa näkyy koodauksen jälkeen vain koodattu merkkijono ja ACE-etuliite. Verkkotunnus, kuten παράδειγμα (kreikaksi ”esimerkki”), vastaa seuraavaa koodausta:
IDN: esimerkki
ACE: xn–hxajbheg2az3al
Jos verkkotunnus sisältää vain perusmerkkejä, Punycode-koodausta ei käytetä. Näin ollen ACE-etuliitettä ei lisätä. Koodausta ei tässä tapauksessa tarvita, koska Internetin perusprotokollat pystyvät jo tulkitsemaan verkkotunnuksen.
Kun tarkastellaan täydellistä verkkotunnusta (FQDN) kokonaisuutena, jokainen osa (ylätason verkkotunnus, toisen tason verkkotunnus, kolmannen tason verkkotunnus jne.) koodataan erikseen. Verkkotunnuskuten пример.bg (bulgariaksi ”example.bg”) voitaisiin koodata seuraavasti
IDN: esimerkki.bg
ACE: xn–e1afmkfd.xn–90ae
Seuraavassa taulukossa on yhteenveto Punycode-syntaksin eri muunnoksista.
| IDN | Punycode | ACE | |
|---|---|---|---|
| Perus- ja muut merkit | müller-büromöbel.de
|
mller-brombel-rmb4fg.de
|
xn--mller-brombel-rmb4fg.de
|
| Vain ei-perusmerkit | Παράδειγμα.gr
|
hxajbheg2az3al.gr
|
xn--hxajbheg2az3al.gr
|
| Vain perusmerkit | example.org
|
example.org
|
Ei käyttöä |
Punycode-algoritmi kuvataan yksityiskohtaisesti RFC 3492 -standardissa. Lisäksi asiakirjassa esitetään koodausmenettelyn toteutus C-ohjelmointikielellä.
Käyttäjät turvautuvat yleensä ilmaiseksi saatavilla oleviin Punycode-muuntimiin kansainvälistettyjen verkkotunnusten koodaamiseksi.
Puny-koodaus emoji-verkkotunnuksissa
Punycoden avulla voidaan toteuttaa paitsi kansainvälistettyjä verkkotunnuksia myös emojiverkkotunnuksia. Jotta tämä toimisi, ylätason verkkotunnuksen on kuitenkin sallittava emojien käyttö, ja halutun emojin on kuuluttava Unicode-standardiin.
Tällä hetkellä emoji-verkkotunnuksia voi rekisteröidä seuraavilla aliverkkotunnuksilla: .ws, .tk, .to, .ml, .ga, .cf, .gq ja .fm.
Emoji-verkkotunnukset käsitellään teknisesti Punycode-muodossa, mutta teoriassa ne tulisi esittää käyttäjälle tekstin ja hymiöiden yhdistelmänä.
Emoji-verkkotunnus: https://i❤.ws/
ACE: https://xn--i-7iq.ws/
Tällä hetkellä käytännössä mikään tavallinen selain ei tue tätä ominaisuutta. Jos kirjoitat emoji-verkkotunnuksen Firefoxiin, Chromeen, Safarille, Edgeen tai Operaan, osoiterivillä näkyy vain ACE-merkkijono.
Onko olemassa ilmaisia Punycode-muuntimia?
Verkosta löytyy useita ilmaisia Punycode-muuntimia, jotka muuntavat IDN-osoitteet ASCII-yhteensopivaan muotoon. Yksi esimerkki on Punycoder.

Muiden ylätason verkkotunnusten (TLD) IDN-osoitteiden muuntamiseen sopii hyvin Mathias Bynensin punycode.js-kirjas toon perustuva Punycode-muunnin.

Aiheuttaako Punycode turvallisuusriskin?
Punycode muodostuu turvallisuusriskiksi homografisen phishingin yhteydessä – kyseessä ovat kyberhyökkäykset, joissa rikolliset hyödyntävät eri merkkien samankaltaista ulkonäköä houkutellakseen hyväuskoisia uhreja väärennetyille verkkosivustoille. Bloggaaja Xudong Zheng havainnollistaa, miltä phishing-hyökkäys näyttää, käyttäen esimerkkinä seuraavaa Punycode-verkkotunnusta: https://www.xn--80ak6aa92e.com/. Tämä ohjaa internetin käyttäjät verkkosivustolle, jolla on seuraava IDN: https://www.аррӏе.com/
Annettu URL-osoite ei ole kalifornialaisen teknologiayrityksen Apple Inc:n virallinen verkkosivusto, vaan esittelytarkoituksessa luotu tietojenkalastelusivusto.
ASCII-merkin a (Unicode U+0061) sijaan käytetään kyrillistä а-merkkiä (U+0430) – näitä kahta merkkiä on vaikea erottaa toisistaan paljaalla silmällä, mutta verkkoselaimet tulkitsevat ne eri merkeiksi. Edes varmenteet eivät pysty takaamaan internetin käyttäjien turvallisuutta. Nykyaikaisissa tietojenkalastelukampanjoissa rikolliset luovat kelvollisia SSL-varmenteita, jotta heidän verkkosivustonsa näyttäisivät aidoilta.
Chromen ja Operan nykyiset versiot estävät tällaiset tietojenkalasteluhyökkäykset näyttämällä ACE-merkkijonon kansainvälistetyn verkkotunnuksen sijaan, kun verkkotunnuksessa (IDN) on sekoitettu eri merkistöjen merkkejä. Internet Explorer ja Microsoft Edge estävät pääsyn tällaisiin verkkotunnuksiin. Firefox ei sen sijaan tarjoa minkäänlaista suojaa Punycode-tietojenkalastelua vastaan.

Näin Firefox-käyttäjät voivat suojautua. Phishing-sivustojen aiheuttaman riskin vähentämiseksi Firefox-käyttäjillä on tällä hetkellä käytettävissään vain vaihtoehto, jolla estetään Punycoden muuntaminen IDN-osoitteiksi yleisesti. Tämä väliaikainen ratkaisu vaatii vain kaksi vaihetta:
- Avaa asetusten muokkausohjelma: Kirjoita selaimen osoiteriville about:config avataksesi Firefoxin asetusten muokkausohjelman.
- Pakota Punycode: Etsi asetus network.IDN_show_punycode ja muuta sen arvo false:sta true:ksi.
Asetusten määrittämisen jälkeen Firefox näyttää kansainvälistetyt verkkotunnukset osoiterivillä ACE-merkkijonoina.