Jak převést internacionalizované doménové názvy pomocí Punycode
Punycode je standardizovaná metoda kódování, která umožňuje mapovat znaky Unicode pomocí omezené sady znaků ASCII, což znamená, že internacionalizované doménové názvy (IDN) mohou obsahovat také znaky mimo sadu ASCII, jako jsou například přehlásky.
Jak byla vyvinuta metoda kódování?
V roce 2003 byl Punycode standardizován organizací Internet Engineering Task Force (IETF) jako syntaxe pro kódování mezinárodních doménových jmen v aplikacích (IDNA). IETF definuje doménové jméno jako IDN, pokud obsahuje speciální znaky, jako jsou diakritické znaménka, písmena nebo znaky, které se nevyskytují v latinské abecedě (např. přehlásky v němčině). Tyto znaky nelze zpracovat pomocí základních protokolů, jako je Domain Name System (DNS). V tomto příkladu použijeme doménové jméno v němčině. Ačkoli po zavedení IDN je müller-büromöbel (Müllerův kancelářský nábytek) povolen pod doménou nejvyšší úrovně .de, lze jej zpracovat pouze kódováním znaků, které nejsou součástí základní sady, například v kontextu překladu názvů. Mnoho internetových protokolů je založeno na angličtině, a proto podporuje pouze omezenou sadu znaků ASCII.
Aby byla zajištěna kompatibilita mezi IDN a staršími internetovými standardy, IETF stanovila metodu kódování internacionalizovaných doménových jmen pomocí znaků, které již byly povoleny. Tento standardizovaný postup kódování se nazývá Punycode.
U e-mailových adres se Punycode používá pouze pro internacionalizované e-mailové domény. Pokud místní část (před znakem @) obsahuje znaky mimo ASCII, je kódována pomocí UTF-8.
Jak funguje kódování Punycode?
Přehled procesu Punycode
Punycode je definován organizací IETF v dokumentu RFC 3492 jako možná aplikace obecného kódovacího algoritmu známého jako Bootstring. Algoritmus Bootstring umožňuje mapování řetězců znaků, které obsahují libovolné znakové sady s omezeným výběrem prvků. Vývoj kódovacího postupu je založen na šesti principech. V kódování Punycode se tyto prvky nazývají základní znaky, které se skládají z malých písmen, číslic a pomlčky (-). Vývoj kódovací metody je založen na šesti principech.
- Úplnost: Každý výstupní řetězec lze pomocí bootstringu namapovat na zjednodušený řetězec.
- Jedinečnost: Přiřazení výstupního řetězce k příslušnému kódování Bootstring je jedinečné. Každému Punycode lze přiřadit přesně jeden ekvivalent ASCII a naopak.
- Obrátitelnost: Kódování bootstringu lze kdykoli obrátit bez ztráty informací.
- Účinnost: Kódovaný řetězec je – pokud vůbec – jen minimálně delší než výstupní řetězec.
- Jednoduchost: Bootstring používá jednoduché algoritmy kódování a dekódování.
- Čitelnost: Kódovány jsou pouze znaky, které nelze zobrazit v cílové znakové sadě. Všechny ostatní znaky zůstávají beze změny.
Punycode specifikuje Bootstring podle požadavků na internacionalizované doménové názvy. To by mělo umožnit mapování znaků Unicode pomocí dříve povolených základních znaků.
Příklad Punycode
Následující příklad ukazuje, jak kódování funguje:
IDN: müller-büromöbel
IDN müller-büromöbel obsahuje znaky ü a ö, které nejsou zahrnuty v dříve povolené znakové sadě pro doménová jména. Z tohoto důvodu musí být zakódovány pomocí Punycode, aby byla zajištěna kompatibilita.
Krok 1: Normalizace
V prvním kroku umožňuje kódovací postup normalizaci výstupního znakového řetězce. Všechna velká písmena jsou nahrazena odpovídajícími malými písmeny.
Krok 2: Odstranění všech znaků, které nejsou základními znaky
Ve druhém kroku jsou odstraněny všechny znaky, které nejsou základní. Ty jsou poté přidány k doménovému jménu v kódované podobě a odděleny pomlčkou.
Pokud se k zakódování internetových adres používá syntaxe Punycode, každý výsledný řetězec je opatřen předponou ACE (zkratka pro ASCII-kompatibilní kódování):
Předpona ACE: xn–
Předpona ACE zajišťuje, že doménová jména obsahující pomlčky nebudou mylně interpretována jako mezinárodní doménová jména.
Výsledkem je následující kódování pro IDN müller-büromöbel:
ACE: xn–mller-brombel-rmb4fg
Algoritmus, na kterém je založen postup Punycode, je pozoruhodný. Zajišťuje, že i přes konverzi nepřekročí délka doménových štítků maximální délku 63 znaků.
Během procesu kódování nejsou znaky Unicode převáděny jeden k jednomu na znaky ASCII. Algoritmus místo toho určuje řetězec na základě vzdálenosti mezi vymazanými znaky a pozicí znaků ve výstupním řetězci.
V souvislosti s výše uvedeným příkladem řetězec rmb4fg označuje, že mller-brombel musí být doplněn znaky Unicode ü a ö na druhé a sedmé pozici.

Výjimky z pravidla
K odchylkám dochází, pokud doménové jméno neobsahuje žádné znaky mimo základní sadu nebo pokud obsahuje pouze znaky mimo základní sadu.
Doménové jméno, které obsahuje pouze znaky mimo základní znakovou sadu, po zakódování zobrazuje pouze zakódovaný řetězec a předponu ACE. Doménové jméno jako παράδειγμα (řecky „příklad“) odpovídá následujícímu kódování:
IDN: příklad
ACE: xn–hxajbheg2az3al
Pokud doménové jméno obsahuje pouze základní znaky, Punycode se nepoužívá. V souladu s tím se nepřipojuje žádná předpona ACE. V tomto případě není kódování nutné, protože základní internetové protokoly již doménové jméno rozumějí.
Pokud vezmeme v úvahu plně kvalifikovaný název domény (FQDN) jako celek, každá značka (doména nejvyšší úrovně, doména druhé úrovně, doména třetí úrovně atd.) je kódována samostatně. Doménajako пример.бг (bulharsky „example.bg“) by mohla být kódována následovně
IDN: пример.бг
ACE: xn–e1afmkfd.xn–90ae
Následující tabulka poskytuje přehled různých variant syntaxe Punycode.
| IDN | Punycode | ACE | |
|---|---|---|---|
| Základní a nezákladní znaky | müller-büromöbel.de
|
mller-brombel-rmb4fg.de
|
xn--mller-brombel-rmb4fg.de
|
| Pouze nezákladní znaky | Παράδειγμα.gr
|
hxajbheg2az3al.gr
|
xn--hxajbheg2az3al.gr
|
| Pouze základní znaky | example.org
|
example.org
|
Nepoužívá se |
Algoritmus Punycode je podrobně popsán v dokumentu RFC 3492. Dokument navíc obsahuje implementaci kódovacího postupu v programovacím jazyce C.
Uživatelé obvykle využívají volně dostupné převaděče Punycode pro kódování internacionalizovaných doménových jmen.
Slabé kódování s doménami emoji
Pomocí Punycode lze realizovat nejen internacionalizované doménové názvy, ale také domény s emodži. Aby to však fungovalo, musí doména nejvyšší úrovně povolovat použití emodži a požadovaný emotikon musí být v normě Unicode.
V současné době umožňují registraci domén s emodži následující TLD: .ws, .tk, .to, .ml, .ga, .cf, .gq a .fm.
Emoji domény jsou technicky zpracovávány jako Punycode, ale teoreticky by měly být uživateli prezentovány jako kombinace textu a emotikonů.
Doména Emoji: https://i❤.ws/
ACE: https://xn--i-7iq.ws/
V současné době to prakticky žádný standardní prohlížeč neimplementuje. Pokud zadáte doménu emoji ve Firefoxu, Chromu, Safari, Edge nebo Opeře, adresní řádek zobrazí pouze řetězec ACE.
Existují bezplatné převaděče Punycode?
Bezplatné generátory Punycode, které převádějí IDN do formátu kompatibilního s ASCII, lze najít na různých webových stránkách. Jedním z příkladů je Punycoder.

Pro IDN jiných TLD je dobrou volbou převodník Punycode od Mathiase Bynensa založený na punycode.js.

Představuje Punycode bezpečnostní riziko?
Punycode se stává bezpečnostním rizikem v případě homografického phishingu – kybernetických útoků, při nichž zločinci využívají podobný vzhled různých znaků k nalákání nic netušících obětí na falešné webové stránky. Blogger Xudong Zheng ukazuje, jak vypadá phishingový útok, na příkladu následující domény Punycode https://www.xn--80ak6aa92e.com/. Ta vede internetové uživatele na webovou stránku s následujícím IDN: https://www.аррӏе.com/
Uvedená adresa URL není oficiální webovou stránkou kalifornské technologické společnosti Apple Inc., ale phishingovou webovou stránkou vytvořenou pro demonstrační účely.
Místo znaku ASCII a s Unicode U+0061 se používá cyrilice а (U+0430) – tyto dva znaky lze pouhým okem téměř nerozeznat, ale webové prohlížeče je interpretují jako odlišné znaky. Ani certifikáty nemohou zajistit bezpečnost internetových uživatelů. V moderních phishingových kampaních vytvářejí zločinci platné certifikáty SSL s cílem, aby jejich webové stránky vypadaly autenticky.
Aktuální verze prohlížečů Chrome a Opera zabraňují phishingovým útokům tímto typu tím, že namísto internacionalizované domény zobrazují řetězec ACE u IDN, které kombinují znaky z různých znakových sad. Prohlížeče Internet Explorer a Microsoft Edge zabraňují přístupu k doménám tohoto typu. Prohlížeč Firefox však nenabízí žádnou ochranu proti phishingu pomocí Punycode.

Takto se mohou uživatelé Firefoxu chránit. Aby se snížilo riziko, které představují phishingové weby, mají uživatelé Firefoxu v současné době pouze možnost zabránit překladu Punycode do IDN obecně. K tomuto dočasnému řešení jsou nutné pouze dva kroky:
- Otevřete editor nastavení: Do adresního řádku webového prohlížeče zadejte about:config a otevřete editor nastavení Firefoxu.
- Vynutit Punycode: Najděte nastavení network.IDN_show_punycode a změňte jeho hodnotu z false na true.
Po konfiguraci bude Firefox zobrazovat internacionalizované domény v adresním řádku jako řetězce ACE.