Clear site: Zametáme data

Javascript i server si mohou do prohlížeče ukládat nejrůznější data, např. Cookies, LocalStorage, atd. Stejně tak prohlížeč si může uložit data stránky (styly, skripty, apod.) do cache. Je toho tolik, že ani nemůžete mít přehled o tom, co všechno má váš server v prohlížeči uživatele uloženo.

Jak ale zajistit, aby se v případě odhlášení, nasazení nové verze nebo v nejhorším případě útoku, vše vymazalo nebo vrátilo do požadovaného stavu?

K tomu slouží nová (práce začala v srpnu 2015) HTTP hlavička specifikovaná W3C:

HTTP/1.1 200 OK
Clear-Site-Data: "cache", "cookies", "storage", "executionContexts"

Zatím (březen 2018) je podporována v Chrome/WebView 61+ a Opera 48+ vydané v září 2017. Navíc je stále v Draft verzi, takže se ještě může změnit. Nicméně s nástupem GDPR na konci května 2018 bych čekal, že ostatní prohlížeče ji urychleně doplní (tedy Firefox; u Edge a Safari budeme muset počkat, zda se rozhodnou ji vydat v další verzi OS).

Hlavička slouží k tomu, aby server, jakožto důvěryhodný origin, mohl rozhodnout o tom, která data na straně klienta již nebude potřebovat nebo mohou být kompromitována.

Pomocí 4 klíčových řetězců můžete určit, co se má smazat a co naopak zachovat. Všimněte si, že hodnoty jsou uváděny v uvozovkách (nejde tedy o klíčová slova jako třeba u Client hints) a jsou odděleny čárkami. To je proto, aby se v budoucnu dala tato syntaxe rozšířit a dalo se lépe specifikovat, co přesně se má nebo nemá vymazat.

Cookies

Úložiště Cookies slouží primárně pro ukládání dat serveru, ale může je využít i JavaScript. Cookies jsou vždy svázány s konkrétní doménou nebo subdoménou a tak je také potřeba je vymazávat.

Pokud hlavička přijde v dotazu na http://www.server.com/, vymaže cookies svázané se subdoménou www, ale již ne třeba s images.server.com.

Při výmazu je tedy potřeba dávat pozor na to, odkud hlavičku pošlete. Odeslat hlavičku v odpovědi na https://shop.server.com/user/logout dojde k vymazání Cookies v obchodě, což je pravděpodobně očekávané chování.

Pokud ale subdoména slouží pouze jako pod-služba hlavního serveru (např. http://account.server.com/logout), bude potřeba zajistit odeslání hlavičky ze správné URL (např. přesměrováním):

> GET logout
> host: account.server.com

< HTTP/1.1 302 Moved Temporarely
< Location: http://server.com/clear

> GET clear
> host: server.com

< HTTP/1.1 200 OK
< Clear-Site-Date: "cookies"

Pozor také na to, že data se vymazávají až po přijetí odpovědi, takže Cookies vytvořené v dané odpovědi se také vymažou. Pokud potřebujete uložit nové hodnoty po vymazání (např. si chcete uložit to, že uživatel se odhlásil), je potřeba nová data uložit až po dalším přesměrování:

> GET logout
> host: shop.server.com

< HTTP/1.1 301 Moved Temporarely
< Clear-Site-Date: "cookies"
< Location: http://shop.server.com/after-logout?user=123456

> GET after-logout?user=123456
> host: shop.server.com

< HTTP/1.1 200 OK
< Set-Cookie: Logged=0
< Set-Cookie: User=123456

Uvědomte si, že Cookies slouží jako úložiště SessionID a po jejich vymazání dojde ke ztrátě session na straně serveru! Pokud byste chtěli session zachovat, bylo by potřeba dané ID uložit dočasně do URL.

Na závěr ještě jedna poznámka: požadavek na vymazání Cookies může vymazat i další data, která se ke Cookies váží, ale nejsou uložena přímo v prostoru Cookies. Konkrétní situace se týkají spíše výjimek, např. speciálních způsobů přihlášení nebo ověření.

Storage

Úložiště určené pro JavaScript, které server přímo používat nemůže, ale přesto může potřebovat mít nad ním kontrolu. Třeba v případě, že používáte službu třetí strany (např. Google Analytics) a musíte ji donutit smazat všechny data (např. po opt-out uživatele).

Hodnota „storage“ znamená výmaz všech stránkou vygenerovaných a lokálně uložených dat (kromě Cookies), takže se týká LocalStorage, SessionStorage a všech ostatních datových úložišť jako jsou databáze a dokonce i Service Workery.

Výmaz se spouští po stažení odpovědi, takže se nemusí týkat nových dat, která vytvoří JavaScript až po načtení stránky.

Cache

Na rozdíl od Cookies a Storage hodnota "cache" způsobí výmaz dat, která si uložil sám prohlížeč pro vlastní potřebu.

Kromě očekávané cache pro soubory (CSS, JS, obrázky, atd.) se ale týká i dalších cache, které prohlížeč používá pro zobrazení stránky. Může tak jít např. o DNS cache, kam si server ukládá adresy a přesměrování (HTTP 302) nebo o grafickou cache, kde může mít prohlížeč uloženy části HTML nebo připravené obrázky pro rychlejší vykreslení po změně stránky. Týká se dokonce i cache v grafické kartě sloužící k vykreslování 2D a 3D objektů.

Tuto hlavičku můžete použít v případě nasazení nové verze, kdy chcete vynutit nové stažení všech souborů.

Pozor ale na to, že hlavička se opět týká jen (sub-)domény, ze které je odeslána. Pokud tedy hlavičku pošlete z https://shop.server.com, nedojde k vymazání obrázků stažených z http://images.server.com. Samozřejmě se netýká ani CDN.

Execution Contexts

Pozor na to, že hodnota "executionContexts" používá camelCase místo v hlavičkách používaného kebab-case (nebo snake_case). Hodnota je uvedena v množném čísle (s „s“ na konci), protože žádá výmaz všech kontextů stránky.

Tato hodnota požaduje výmaz všech kontextů, které slouží k provozování a vykreslování stránky v prohlížeči. Laicky řečeno vyžaduje po prohlížeči, aby celou stránku reloadnul, znova vykreslil a znovu spustil všechny skripty.

Technicky řečeno hodnota vynucuje u prohlížeče, aby restartoval všechny výkonné procesy a jejich datové prostory (kontext), které slouží k vykreslení stránky.

Tento přístup je potřeba u moderních RIA (jako Facebook nebo Twitter), které mohou v prohlížeči běžet celé hodiny nebo dny bez toho, aby se znovu načetly. U takových stránek pak hrozí, že pokud dojde k nějaké chybě nebo útoku třetí strany, ostatní způsoby výmazu (cache, cookies, storage) nemusí vymazat např. útočný skript, který se do stránky dostal.

Posílat tuto hlavičku tedy dává smysl v případě AJAX requestu, který požaduje překreslení celé stránky. Zároveň by se měl provádět až po dokončení ostatních výmazů (cache, storage, atd. – pokud jsou specifikovány), aby po restartu nedošlo k načtení starých (a chybných) dat (to musí zajistit prohlížeč).

Specifikace bohužel přímo neříká, jak se má prohlížeč zachovat, pokud má uživatel stejnou stránku otevřenu ve více oknech. U cache a úložišť se obvykle sdílejí, takže výmaz v jednom okně je vymaže i v ostatních, nicméně pokud jedno okno zresetuje stránku, případný úročný skript může stále běžet v jiném okně a může se znovu nainstalovat. Na druhou stranu věta „ukončí všechny výkonné kontexty zobrazující origin“ může znamenat právě to, že prohlížeč musí restartovat všechna okna zobrazující danou URL.

Vše najednou

Kromě výše uvedených řetězců W3C specifikuje ještě hodnotu "*" (tedy hvězdička v uvozovkách), která způsobí výmaz všeho, co prohlížeč k dané stránce má. Specifičnost této hodnoty je v tom, že pokud by v budoucnu přibyli další možnosti výmazu (např. výmaz uložených hesel), tato hodnota zafunguje i na ně bez nutnosti aktualizovat kód serveru.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Tato stránka používá Akismet k omezení spamu. Podívejte se, jak vaše data z komentářů zpracováváme..