20. listopadu 2023

Říkáme tomu různě: weby, stránky, domény, servery, sajty, internety a spoléháme se na to, že tomu ten druhej bude rozumnět. Možná a možná ne, ale to se dá vždy doladit doplňujícím „počkej, jak jako server, nemyslíš spíš web?“ Jenže různé specifikace a technické dokumenty tuto vymoženost nemohou využít a tak se snaží věci nazývat správnými jmény a jednotně. A to navíc tak skvěle, že pojmy jako origin, site, same origin, same site, eTLD a public suffix se normálně ani nepřekládají, protože pak by tomu zas nikdo nerozuměl. A jak s tím souvisí atraktivita subdomén?

Zjistil jsem, že skoro v každém článku a přednášce některý z těch termínů používám a než abych to pokaždé vysvětloval (a navíc pokaždé jinak zjednodušeně), tak jsem se rozhodl z toho udělat tenhle článek, na který budu moci odkazovat. Skoro celý by se dal vyjádřit i následujícím obrázkem:

Adresa https://www.cam.ac.uk a vyjádření TLD, eTLD, eTLD+1, Site, Origin

Obrázek sice řekne víc než tisíc slov, ale tenhle článek jich má dva tisíce deset

Do tajů URL a všech jeho částí nebudeme zabíhat, to bychom tu byli ještě přiští století. Vysvětlíme si jen to co je v nadpisu, protože na základě toho browser stanovuje určité hranice.

Představte si nějaké to jednoduché URL, třeba:

https://www.example.com/foo/bar

Doména

Tohle je možná spíš jen pro opáčko, ale bude se nám to hodit později. Doména v URL výše je www.example.com a má několik úrovní:

  • Top-level doména (TLD) je com
  • Doména druhé úrovně (2LD) je example.com
  • Třetí úrovně (3LD) je www.example.com
  • A tak dále

Místo domény může být i IP adresa, ale pro jednoduchost zůstaneme u domén.

Registrovatelná doména

Registrovatelná doména je ta část domény, kterou si můžete zaregistrovat nebo pronajmout ať už od registrátora domén nebo od jiného subjektu, který poskytuje např. blogy na subdoménách. Odhlédhneme-li od nějakého dalšího delegování, tak všechny subdomény pod tou registrovatelnou, včetně ní, patří stejné organizaci.

Dalo by se také říci, že registrovatelná doména je to, co píšete do registračního formuláře. Když chcete mít web na www.michalspacek.cz, tak si taky registrujete jen michalspacek.cz. Ovšem ne vždy se registrovatelná doména rovná doméně druhé úrovně.

To je případ třeba Velké Británie, kde si univerzity a další akademické instituce mohou registrovat domény, které shodně končí na ac.uk (ac jako academia) a liší se až doménou třetí úrovně. Příkladem budiž dvě rivalské univerzity Oxford (ox.ac.uk) a Cambridge (cam.ac.uk). Další časté koncovky jsou co.uk (pro komerční subjekty) a net.uk (poskytovatelé připojení k Internetu), celkem jich je skoro 20.

Stejné je to i v mnoha jiných zemích, často jsou k vidění např. subdomény ….gov.něco pro různé vládní organizace. Podobně to platí i pro domény různých úložišť, jako třeba ….s3.amazonaws.com pro službu Amazon S3 nebo domény jako ….blogspot.com, ….blogspot.no, ….blogspot.com.au a tuna dalších pro gůglovo Blogger.

Doména Registrovatelná doména
example.com example.com
www.example.com example.com
foo.bar.example.com example.com
ox.ac.uk ox.ac.uk
www.ox.ac.uk ox.ac.uk
talks.ox.ac.uk ox.ac.uk
blogs.law.ox.ac.uk ox.ac.uk
my.foo.s3.amazonaws.com foo.s3.amazonaws.com
foo.blogspot.com.au foo.blogspot.com.au
www.foo.blogspot.com.au foo.blogspot.com.au

Registrovatelným doménám se někdy hovorově říká i „naked domain“, „base domain“, „root domain“ nebo třeba „apex domain“. Tyto výrazy se snad nikdy nepřekládají do češtiny, protože pod některými těmi výrazy by si mnozí jistě představili něco zcela jiného.

Registrovatelná doména je definována v URL standardu.

Efektivní top-level doména (eTLD) a eTLD+1

Efektivní top-level doména, zkráceně eTLD, je doména o úroveň výše než registrovatelná doména. eTLD je doména, pod kterou se registrují další domény, které obvykle mají různé vlastníky. Často se eTLD rovná samotné TLD, ale v mnoha případech tomu tak není. Pohledem na doménu není bohužel možné jednoduše algoritmicky ani regulárním výrazem zjistit její efektivní top-level nebo registrovatelnou doménu, ale existuje seznam eTLD, do nějž se můžeme (strojově) podívat, viz dále.

Efektivní top-level doména plus jedna neboli eTLD+1, je pak to samé jako registrovatelná doména.

Doména eTLD
example.com com
www.example.com com
foo.bar.example.com com
ox.ac.uk ac.uk
www.ox.ac.uk ac.uk
talks.ox.ac.uk ac.uk
blogs.law.ox.ac.uk ac.uk
foo.blogspot.com.au blogspot.com.au
www.foo.blogspot.com.au blogspot.com.au

eTLD nemůže být registrovatelná, jinými slovy: registrovatelná doména z eTLD je nic.

Public suffix list (PSL)

PSL je seznam efektivních top-level domén, eTLD, akorát tady jim říkají „public suffix“, protože jsou to v podstatě přípony veřejně přímo registrovatelných domén. Soubor je dostupný z webu publicsuffix.org (přímý link) a aktualizuje se pomocí „pull requestů“ na GitHubu.

Část kódu, která se snaží najít eTLD třeba pro www.foo.blogspot.com.au, se do toho seznamu musí podívat a odzadu zjistit jestli:

  • Je au „public suffix“? Je, podobně jako jiné národní domény (ccTLD).
  • Je com.au „public suffix“? Je.
  • Je blogspot.com.au „public suffix“? Taky je.
  • Je foo.blogspot.com.au „public suffix“? Ne, není.
  • Je www.foo.blogspot.com.au „public suffix“? Taky ne.

Výsledkem tedy je, že efektivní TLD (eTLD) je blogspot.com.au, registrovatelná doména a zároveň eTLD+1 je foo.blogspot.com.au.

Ve skutečnosti je to trochu složitější, protože v seznamu se vyskytují i záznamy s * a !, jako např. *.ck ([cokoliv].ck je eTLD) a !www.ck (… kromě www.ck), ale to pro jednoduchost vynecháme.

Je také potřeba projít celou doménu, nestačí se zastavit na prvním „ne“, protože by se klidně mohlo stát, že se na „public suffix“ narazí až někde později: eTLD domény soubory.s3.amazonaws.com je s3.amazonaws.com, protože stejně jako com, tak i s3.amazonaws.com je „public suffix“, ale jen amazonaws.com není.

Prohlížeče používají public suffix list nejčastěji k omezení cookies, aby nešly nastavit s platností pro všechny domény s příponou .co.uk apod. Firefox seznam používá i ke zvýraznění domén v adresním řádku.

URL řádek s adresou https://www.cambridgestudents.cam.ac.uk ve Firefoxu 119, eTLD+1 je zvýrazněna

Zvýraznění eTLD+1 ve Firefoxu 119

URL řádek s adresou https://www.cambridgestudents.cam.ac.uk v Chrome 119, eTLD+1 bez zvýraznění

Pro srovnání stejná doména v Chrome 119

Public suffix list používají i certifikační autority při vydávání tzv. wildcard certifikátů pro HTTPS, nesmí totiž vydat certifikát pro např. *.co.uk. Můžete ho použít i vy, třeba k varování vašich uživatelů ve smyslu „tohle asi nechcete dělat s touto doménou“, ideálně ale k ničemu dalšímu. Knihovny existují pro spoustu jazyků, osobně mám zkušenost s knihovnou PHP Domain Parser, která umí použít i lokálně cachovaný seznam.

Origin

Pojmem origin se označuje ta část URL, která obsahuje protokol (přesněji schéma), doménu a port.

URL Origin
https://www.example.com/foo https://www.example.com
https://www.example.com:303/foo https://www.example.com:303

Všimněte si, že origin nekončí lomítkem, tím už naopak začíná cesta (path) /foo.

Same origin

Pojmem same-origin policy označujeme několik různých omezení, která dovolují dvou věcem nějak dohromady fungovat jen a pouze pokud mají „same origin“ vztah, zjednodušeně řečeno pokud mají stejné originy.

Same-origin policy se používá i např. k omezení JavaScriptu běžícího v iframe (typicky třeba jako součást nějaké reklamy), aby nemohl krást, pardon, číst z rodičovského dokumentu např. pomocí window.parent.document.getElementById('username'), pokud ten iframe a rodičovský dokument nemají stejný origin. V takovém případě to nelze ani obráceně, rodičovský dokument nemůže přistupovat k obsahu iframe (např. pomocí document.getElementById('iframe').contentWindow.document.getElementById('username')).

✔️

  • https://example.com/foo a https://example.com/bar jsou „same origin“
  • https://foo.bar.baz.test/foo a https://foo.bar.baz.test/bar jsou „same origin“, na doméně nezáleží, může to být .com i .cokoliv, jen musí být v obou případech stejná

  • https://example.com/foo a https://www.example.com/bar nejsou „same origin“ (example.com a www.example.com není stejná doména)
  • https://example.com/foo a http://example.com/bar nejsou „same origin“ (https a http nejsou stejné protokoly)
  • https://example.com:4431/foo a https://example.com:4432/bar nejsou „same origin“ (mají rozdílné porty)

Další informace o originusame originu podané o něco formálnějším jazykem se dozvíte v HTML specifikaci.

Site

Pojmem „site“ se často obecně až skoro hovorově označuje celý web, stránky, server, nebo tak něco. Pokud se ovšem ponoříme do trochu striktnějších vod, tak site znamená podmnožinu URL, do které patří protokol (schéma) a registrovatelná doména.

URL Site
https://www.example.com/foo/bar https a example.com
https://neco.nek.de.example.com/ https a example.com
http://www.ox.ac.uk/ http a ox.ac.uk
https://staff.admin.ox.ac.uk/ https a ox.ac.uk
https://www.cam.ac.uk/ https a cam.ac.uk
https://my.foo.s3.amazonaws.com/ https a foo.s3.amazonaws.com
https://foo.blogspot.com.au/ https a foo.blogspot.com.au
https://www.foo.blogspot.com.au/ https a foo.blogspot.com.au

Same site

Dvě URL nebo dva originy jsou „same site“, pokud se rovnají jejich sites, tedy když mají stejné protokoly (schéma) a registrovatelné domény. Na rozdíl od same originu, v tomto případě nezáleží na portu ani na celé doméně.

✔️

  • https://example.com/foo a https://example.com/bar jsou „same site“ (i „same origin“), jejich site je httpsexample.com
  • https://example.com/foo a https://foo.bar.example.com/bar jsou „same site“ (ale ne „same origin“), site je shodně httpsexample.com
  • https://www.example.com/foo a https://foo.bar.example.com/bar jsou „same site“, site obou je httpsexample.com
  • https://www.cam.ac.uk/ a https://www.cambridgestudents.cam.ac.uk/ jsou „same site“, jejich site je httpscam.ac.uk

  • https://example.com/foo a http://example.com/bar mají různé protokoly a tak nejsou „same site“ přestože jejich registrovatelná doména je stejná
  • https://www.ox.ac.uk/ a https://www.cam.ac.uk/ nejsou „same site“, mají různé registrovatelné domény ox.ac.ukcam.ac.uk
  • https://example.com/ a https://example.net/ nejsou „same site“, mají různé registrovatelné domény example.comexample.net
  • https://example.com./ a https://example.com/ nejsou „same site“, mají různé registrovatelné domény example.com. a example.com, ta tečka na konci je podstatná

„Same site“ kontroly používá např. browser pro omezení cookies, které v požadavku buď odešle, nebo ne, podle toho, zda jste na odkaz kliknuli na stejném site jako je site cílové adresy, dle nastavení cookie atributu SameSite.

Pojmy sitesame site jsou detailněji popsány v HTML specifikaci. Za zmínku stojí snad i to, že existuje „same site“ porovnávání bez schématu (schemelessly same site), při němž se porovnávají jen registrovatelné domény. To se kdysi používalo pro cookies, ale pak se přešlo na „schemeful same site“ porovnávání, ve kterém schéma také hraje roli, a kterému dnes říkáme prostě jen „same site“.

Cross-origin a cross-site požadavky

Požadavkům, které vznikly na jednom originu, ale načítají něco z jiného originu, říkáme „cross-origin“ požadavky, je to v podstatě opak „same originu“.

Podobně „cross-site“ požadavky, opak „same site“, vznikly na jednom site, ale načítají něco z jiného site. Jen bacha na to, že někde, např. v názvech útoků jako Cross-Site Scripting (XSS) nebo Cross-Site Request Forgery (CSRF), se „site“ používá v tom obecném významu, ne ve výše uvedeném významu „schéma + registrovatelná doména“.

Raději same origin

Koncept site a public suffixů a jejich seznamu tedy vyžaduje nějakou manuální práci, aby co nejvíce odpovídal aktuální realitě, a trochu tak připomíná toho jednoho borce z Nebrasky. Pokud byste psali nějakou specifikaci, tak je vhodnější použít spíš origin a same origin, jinak se definice site může lišit browser od browseru, protože každý z nich může používat jinou verzi PSL.

Ten sice spravuje Mozilla, tvůrce Firefoxu, takže ty „velké“ prohlížeče i ty „menší“ na nich postavené budou asi v pohodě, ale i tak je dobré zvážit to, jestli chcete bezpečnost vašeho díla založit na tom, jestli někdo přidá řádek do nějakýho souboru a jestli si ten soubor někdo jiný včas stáhne. Nechcete.

Použití „same site“ také zvyšuje atraktivitu subdomén pro útočníky. Převzetí subdomén („subdomain takeover“) je reálný útok, kterým útočníci mohou obejít různá omezení používající „same site“ porovnávání. K tomu všemu jim může stačit i jen zapomenutá subdoména, která se na nic nepoužívá.

Raději tedy same origin.


Mohlo by vás také zajímat

Aktualizace článku

22. listopadu 2023 Přidáno krátké info o cross-origin a cross-site požadavcích

Michal Špaček

Michal Špaček

Vyvíjím webové aplikace, zajímá mě jejich bezpečnost. Nebojím se o tom mluvit veřejně, hledám hranice tak, že je posouvám. Chci naučit webové vývojáře stavět bezpečnější a výkonnější weby a aplikace.

Veřejná školení

Zvu vás na následující školení, která pořádám a vedu: