Rozdrobené cookies

Cookies – technický pohled

Předpokládám, že každý čtenář tohoto blogu má alespoň hrubou představu o tom, co jsou cookies. Tak se na ně podíváme trochu víc technicky a do hloubky.

Základní princip fungování cookies je takový: klientův prohlížeč odešle na server první dotaz, server (samozřejmě za předpokladu, že s cookies chce vůbec pracovat) vrátí odpověď, která obsahuje cookies, a prohlížeč si ji (nebo je) uloží. Tyto cookies pak serveru posílá zpět při každém dalším dotazu třeba na načtení stránky (ale taky třeba u dotazu na načtení obrázků, skriptů, stylů apod., protože GET, že jo).

Cookie může být nastavena buď na serveru pomocí hlavičky Set-Cookie nebo pomocí JavaScriptu prostřednictvím document.cookie:

Příklad zápisu pomocí PHP:

setcookie("uživatel", "jan_novak", time() + 3600, "/", "example.com", true, true);

Příklad zápisu pomocí JavaScriptu:

document.cookie =
  "uživatel=jan_novak; expires=Fri, 31 Dec 2023 23:59:59 GMT; path=/; domain=example.com; secure; SameSite=Strict";

Hodnota cookie může obsahovat téměř jakýkoliv text, ale protože cookies používají specifické znaky jako oddělovače (středník, rovnítko), je často nutné hodnoty kódovat pomocí encodeURIComponent() v JavaScriptu nebo podobných funkcí v jiných jazycích.

Prohlížeč nemusí posílat všechny cookies a nemusí je ani posílat vždy - přímo v cookie se totiž dají nastavit pravidla pro jejich odesílání. Tato pravidla se dají nastavit pomocí:

Doména (Domain)

Cookie je odesláno pouze na servery odpovídající doméně cookie nebo její subdoméně. Například:

  • Cookie s Domain=example.com bude odesláno na example.com, www.example.com, shop.example.com
  • Cookie s Domain=shop.example.com bude odesláno pouze na shop.example.com, ale ne na example.com nebo blog.example.com

Cesta (Path)

Cookie je odesláno pouze na URL adresy, které začínají danou cestou. Například:

  • Cookie s Path=/shop bude odesláno na /shop, /shop/products, ale ne na /blog
  • Cookie s Path=/ (výchozí hodnota) bude odesláno na všechny cesty

Protokol (Secure flag)

Cookie označené jako Secure jsou odeslány pouze přes HTTPS spojení, nikoli přes nezabezpečené HTTP.

SameSite

Určuje, kdy se cookies odesílají při cross-site požadavcích:

  • SameSite=Strict: Cookies jsou odeslány pouze při požadavcích ze stejné domény
  • SameSite=Lax: Cookies jsou odeslány při navigaci z jiných stránek, ale ne při cross-site požadavcích
  • SameSite=None: Cookies jsou odeslány i při cross-site požadavcích (vyžaduje Secure flag)

Takže příklad:

Máte uloženy tyto cookies:

  • user_id=12345; Domain=example.com; Path=/; Secure
  • language=cs; Domain=example.com; Path=/
  • cart_id=ABCDE; Domain=shop.example.com; Path=/shop
  • session=XYZ123; Domain=blog.example.com; Path=/

Při návštěvě https://shop.example.com/shop/products budou odeslány:

  • user_id=12345 (odpovídá doméně a cestě)
  • language=cs (odpovídá doméně a cestě)
  • cart_id=ABCDE (odpovídá doméně a cestě)
  • session=XYZ123 NEBUDE odesláno (neodpovídá doméně)

Při návštěvě http://shop.example.com/shop/products (HTTP, ne HTTPS):

  • language=cs (odpovídá doméně, cestě a není označeno jako Secure)
  • cart_id=ABCDE (odpovídá doméně, cestě a není označeno jako Secure)
  • user_id=12345 NEBUDE odesláno (je označeno jako Secure, ale spojení je HTTP)

Vybrané cookies jsou pak automaticky přidány do hlavičky HTTP požadavku jako Cookie: name1=value1; name2=value2 atd.

Struktura cookies

Cookies musí obsahovat minimálně dvě povinné náležitosti:

  1. Název cookie (name) - identifikátor, podle kterého server i klient rozpozná cookie
  2. Hodnota cookie (value) - samotná data, která cookie uchovává

Vše ostatní jsou volitelné atributy, které upřesňují chování cookie:

  • Domain
  • Path
  • Expires / Max-Age
  • Secure
  • HttpOnly
  • SameSite

Takže nejjednodušší platná cookie by mohla vypadat takto:

Set-Cookie: nazev=hodnota

Nebo v JavaScriptu:

document.cookie = "nazev=hodnota";

Příklad HTTP požadavku obsahujícího cookies:

GET /produkty HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
Cookie: user_id=123456; language=cs; session=abcdef123456

Pokud nejsou specifikovány žádné další atributy, vytvoří se cookie s těmito výchozími vlastnostmi:

  • Platná pouze pro aktuální doménu (bez subdomén)
  • Platná pro celý web (Path=/)
  • Je to “session cookie” - vymaže se po zavření prohlížeče
  • Není omezena pouze na HTTPS
  • Je přístupná pro JavaScript
  • SameSite má výchozí hodnotu “Lax” v moderních prohlížečích

Je důležité zmínit, že ačkoliv tyto další atributy nejsou povinné z hlediska syntaxe, z bezpečnostních důvodů se často doporučuje specifikovat minimálně:

  • Domain - pro přesné určení rozsahu platnosti
  • Path - pro omezení cookies na konkrétní části webu
  • Secure - pro ochranu přenosu přes HTTPS
  • SameSite - pro ochranu proti cross-site request forgery (CSRF) útokům

Prohlížeče si cookies ukládají jako skryté soubory na disk, jejich přesné umístění pak záleží na operačním systému i konkrétním prohlížeči, nicméně nejjednodušším způsobem je můžete prozkoumat přímo u sebe v prohlížeči, a to když se přepnete do vývojářského režimu (u většiny prohlížečů ve Windows k tomu funguje klávesová zkratka Ctrl + Shift + I), přejdete na záložku „Aplikace" a zpravidla pak v levém sloupci u kraje budete mít přímo možnost rozkliknout si řádek s Cookie (rozložení může být trochu jiné v závislosti na prohlížeči a vašem nastavení).

Velikost cookies je omezena (obvykle na 4KB). Webové stránky mohou ukládat více cookies (a také tak zpravidla dělají, protože to je v mnoha ohledech praktičtější kvůli omezení přenášených a zpracovávaných dat), ale prohlížeče mají limit na počet cookies na doménu (obvykle 50-180) a celkový počet cookies (300-500).


Tento článek představil technickou stránku cookies, v dalších článcích se pak budu podrobněji věnovat nejčastějším typům útoků s nimi spojených.

První spuštění a konfigurace Alfa adaptéru pro monitoring WiFi
Používané autentizační metody a principy jejich fungování

Start the conversation