Háčky a čárky v doméně – úvod do IDN v ASP.NET

O smysluplnosti, výhodách a problémech národních znaků v doménách (IDN – Internationalized Domain Names) lze vésti disputace velmi dlouho. Nicméně IDN jsou zde a je dobré vědět, jak se s nimi dokáže vyrovnat IIS a ASP.NET.

Co je IDN a IRI

Historicky doménová jména (a od nich odvozená URI) počítají toliko se znaky anglické abecedy. Nebylo tedy možné zaregistrovat si doménu, která obsahuje například znaky s českou diakritikou – nebo čínské či arabské znaky. Tuto situaci řeší technologie IDN (Internationalized Domain Names) a potažmo IRI (Internationalized Resource Identifier). Ta nabízí možnost do doménových jmen vkládat jakékoliv Unicode znaky.

V současné době se správcové jednotlivých top-level domén rozhodují, zda IDN budou ve svých TLD podporovat nebo nikoliv. Správce české národní domény cz, kterým je CZ.NIC, se rozhodl až na další IDN nezavádět, v souladu s výsledky opakovaných průzkumů, v nichž se stále větší počet uživatelů Internetu v ČR vyjadřuje proti zavedení IDN (více zde nebo zde, pokud váš browser nepodporuje IDN). Z nám blízkých domén IDN podporuje třeba "evropská" TLD eu.

Se zaváděním IDN je spojena celá řada technických a bezpečnostních problémů, které jsou nastíněny například na výše uvedeném webu www.háčkyčárky.cz (ano, je tam diakritika). Nehodlám je diskutovat zde, IDN jsou sice mírně vzdálenou, ale přesto realitou, a je dobré vědět, jak s nimi technologicky nakládat.

Proto jsem se rozhodl z edukativních důvodů pro svůj projekt "Naše tváře" kromě obvyklé adresy www.nasetvare.eu zprovoznit i www.našetváře.eu a podívat se, na jaké problény přitom narazím.

Kódování Punycode

Technicky to funguje tak, že daný text (název domény) se zakóduje způsobem popsaným v RFC 3492 (Punycode). Co do účelu se dí Punycode přirovnat třeba ke kódováním jako Quoted Printable, Base64 nebo UUencode – umožňuje zapsat šestnáctibitové Unicode znaky pomocí omezené znakové sady, která je k dispozici. Tento algoritmus je dosti komplikovaný a rozhodně není intuitivní. Původně se nepředpokládalo, že s ním koncový uživatel přijde do styku.

Pro zakódování a dekódování názvu domény můžete použít například nástroj na webu VeriSignu. Takže třeba moje příjmení (Valášek) se zakóduje jako xn--valek-zqa01g. Pokud bych si chtěl zaregistrovat doménu valášek.cz (a CZ.NIC to umožňoval), registroval bych si fakticky doménu xn--valek-zqa01g.cz (za normálních okolností nelze zaregistrovat doménu, která by obsahovala dvě pomlčky za sebou).

Jak to funguje

Pokud zadáte do prohlížeče adresu, obsahující národní znaky, prohlížeč ji přeloží pomocí Punycode na výše uvedený formát. Ten se použije ve veškeré další komunikaci – pro DNS dotaz, pro hlavičku Host v HTTP requestu a podobně. Reálně tedy potřebujeme podporu na třech místech: v prohlížeči, v DNS serveru, kde má být příslušná doména hostovaná a na web serveru samotném. Posledním článkem řetězu je ASP.NET aplikace, která může adresu, na které běží, ignorovat, a nebo s ní nějak pracovat.

Prohlížeč

Vše začíná v prohlížeči, který musí IDN podporovat. Všechny v současné době aktuální browsery IDN zvládají. Výjimkou je stále ještě se občas vyskytující IE 6, který potřebuje speciální plugin. Nicméně IE7, IE8 a aktuální verze Mozilly, Opery, Chrome i Safari IDN podporují. Konkrétní chování záleží na prohlížeči a nastavení – zejména, zda se vám ukáže URL s nabodeníčky a nebo zakódované.

Internet Explorer postupuje podle toho, zda je jazyk, v němž je adresa zapsána, mezi těmi, které si uživatel vybral v nastavení (Tools –> Internet Options –> Languages). Pokud ano, zobrazí tvar se speciálními znaky (a to i pokud původně zadáte tvar kódovaný, tj. xn--*):

IDN-enabled Pokud jazyk, v němž je adresa zapsána, nepatří mezi podporované, ukáže se adresa v zakódovaném tvaru a navíc se zobrazí varování, že adresa obsahuje znaky nekompatibilní se současným jazykovým nastavením:

IDN-disabled

Na mém nastavení (anglický systém a české regionální nastavení) se anglické nejnovější verze ostatních prohlížečů chovaly následovně: Chrome a Firefox zobrazil adresu v zakódovaném tvaru, Opera a Safari se speciálními znaky. Všechny prohlížeče ale zobrazily výslednou stránku v pořádku. Předpokládám, že v případě ostatních prohlížečů je chování řízeno nějakými nastaveními, ale do hloubky jsem ho nezkoumal.

DNS Server

DNS server autoritativní pro danou doménu musí být schopen opečovávat zónu pro IDN doménu. Což obvykle nebývá problém, Microsoft DNS Server, který je součástí Windows 2003, Windows 2008 i Windows 2008 R2 to bez problémů zvládl. Doménu definujte v punnycode tvaru stejně, jak každou jinou.

Web Server

Pokud máte pro každý web samostatnou IP adresu (resp. samostatný TCP endpoint, abychom byli korektní), web server host name vůbec nezajímá a nijak ho neřeší. V praxi ale obvykle využíváme vymožeností HTTP verze 1.1 a na jedné IP hostujeme webů několik a rozlišujeme mezi nimi prostřednictvím host name, které nám prohlížeč pošle v hlavičce "host". IIS se kombinace IP adresy, portu a host name nazývá "binding". IDN jsou podporovány a zadávají se v nezakódovaném tvaru, tj. do pole "host name" napíšete doménu s háčky a čárkami.

ASP.NET

Do .NET frameworku se podpora IDN a IRI dostala ve verzích 2.0 SP1 resp. 3.0 SP1. Je ovšem nutné ji explicitně zapnout v konfiguraci, v souboru web.config:

<?xml version="1.0"?>

<configuration>

    <configSections>

        <section name="uri" type="System.Configuration.UriSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>

    </configSections>

    <uri>

        <idn enabled="All"/>

        <iriParsing enabled="true"/>

    </uri>

</configuration>

Ve verzi 4.0 je už sekce <uri> standardně registrována a není nutno ji registrovat.

Atribut idn/@enabled řeší zpracování punnycode v doménovém jméně, tj. v názvu serveru. Může nabývat třech hodnot: Výchozí je None, kdy je podpora IDN vypnuta. Pokud se tedy zeptáte např. na hodnotu vlastnosti Request.Url.Host, dostane se vám zakódovaných dat s xn-- na začátku. Hodnota All podporu IDN zapne ve všech případech. Hodnota AllExceptIntranet zapne překlad pouze pro internetové adresy, ne pro lokální intranet.

Atribut iriParsing/@enabled řeší zpracování punnycode v ostatních částech URI, tj. např. jako název složky nebo souboru. Má hodnotu True nebo False (default).

Závěr

Microsoft platforma pro web s IDN a IRI nemá problém. Prohlížeče, DNS, web server i ASP.NET si dokáží s oháčkovanými doménami poradit. Pokud si chcete IDN jen tak vyzkoušet, můžete si ho vyzkoušet na subdoménách pod svou kontrolou, omezení CZ.NIC se vztahuje jenom na název domény druhé úrovně, na nic jiného – viz například adresu http://testíček.byte.cz (není tam nic zajímavého, ale server vám odpoví). S dalšími síťovými službami už je to horší. Rozchodit na IDN doméně korektně například e-mail už je výrazně obtížnější. Stejně tak praktická použitelnost IDN webů je limitovaná, protože řada systémů (včetně tohoto) vám nedovolí URL s háčky a čárkami zadat, o čemž se přesvědčil jeden ze čtenářů toho webu, když mi poslal mail se stížností, že nemůže do komentáře zadat adresu svého nového IDN webu.

  • Altairis
  • Nemesis
  • Microsoft MVP
  • IIS
  • ASP.NET