Na této stránce
Správa session
Session = posloupnost transakcí a HTTP požadavků spojených se stejným uživatelem
Session poskytuje možnost stanovení přístupových práv, lokalizace, jazykových preferencí a dalších proměnných, které se budou vztahovat ke každé interakci uživatele s aplikací po dobu trvání session
Session umožňuje identifikaci uživatele po přihlášení
Je však možné je vytvářet i pro anonymní uživatele
Po přihlášení je vytvořené session ID ekvivalentní uživatelskému jménu a heslu, certifikátu, tokenu, biometrickým údajům a dalším
Session koncept byl zaveden proto, že každý požadavek a odpověď jsou na sobě nezávislé (stateless)
Session ID nebo token se váže na poslední přihlášení
Implementace bezpečného správy session je náročná, protože je v rukou vývojáře
Framework neposkytuje striktní vztahy mezi přihlášením, správou session a řízením přístupu
Útočníci mohou provádět session hijacking útoky (předvídání, brute force, zachycení, fixace session ID)
Útočník se může vydávat za jiného (konkrétního nebo jakéhokoli) uživatele
Vlastnosti session ID
Session ID slouží k udržení stavu o přihlášeném uživateli
Session ID je sdílen a vyměňován mezi uživatelem a aplikací po celou dobu trvání session
Je odesíláno při každém HTTP požadavku
Session ID je dvojice name=value
Session ID name fingerprinting
Nedělejte název session ID příliš popisný (neměl by poskytovat podrobnosti o účelu a významu)
Názvy používané v běžných frameworcích lze snadno identifikovat (PHPSESSID
, JSESSIONID
)
Session name může prozradit pou žívané technologie a jazyky
Změňte výchozí session ID name na obecný název (např. id
)
Délka session ID
Zajistěte, aby bylo session ID dostatečně dlouhé (zabránění brute force útoků)
Zajistěte, aby byla délka alespoň 128b (16B)
Délka je sama o sobě pouze referenční - sílu ovlivňují další faktory
Session ID entropy
Zajistěte, aby bylo session ID nepředvídatelné (zabránění “guessing” útokům)
Použijte kvalitní generátor pseudonáhodných čísel (CSPRNG )
Session ID value musí poskytovat alespoň 64b entropy (polovina délky session ID)
Útočníkovi bude trvat nejméně 292 let, než uhodne platné ID s 64b entropy
Zabraňte duplicitním ID - session ID není pouze náhodné, ale také jedinečné
Obsah / hodnota session ID
Zajistěte, aby byla hodnota session ID bezvýznamná (zabránění úniku informací)
Zajistěte, aby hodnota nikdy neobsahovala citlivé informace
Uložte význam a logiku spojenou se session ID na serveru
Uložené informace mohou zahrnovat IP adresu, user agent, email, uživatelské jméno, id uživatele, roli, přístupová práva, jazykové preference, session limit atd.
Zašifrujte a řádně ochraňte session v případě, že obsahuje citlivé informace (kreditní karty)
Použijte session ID vytvořené frameworkem
Použijte CSPRNG generátor o velikosti alespoň 128b a zajistěte unikátnost v případě, že potřebujete vytvořit vlastní session ID
Implementace správy session
Mechanismus, který bude použit k výměně session mezi uživatelem a aplikací
Existuje více možností výměny - cookies, URL parametry a argumenty, skrytá pole formuláře, HTTP hlavičky
Mechanismus by měl umožňovat definování vlastností jako je datum a čas vypršení platnosti, granulární omezení použití
Jeden z důvodů, proč jsou cookies nejrozšířenějším mechanismem (nabízejí možnosti, které jsou nedostupné u jiných metod)
Použití některých mechanismů může vést k odhalení session ID a usnadnění dalších útoků
Built-in implementace
Používejte vestavěné funkce frameworků namísto vytváření vlastních mechanismů od nuly
Používají se po celém světě v mnoha prostřed ích, a tak jsou časem prověřeny vývojáři i bezpečnostními odborníky
Používejte nejnovější dostupné verze frameworků
Zkontrolujte a případně změňte výchozí konfiguraci, abyste zvýšili bezpečnost
Postupujte podle doporučení v tomto dokumentu
Zabezpečte session ID úložiště před neoprávněným přístupem a vyzrazením
Mechanismy výměny session ID
Využívejte cookies pro správu výměny session ID
Zabraňte přijetí session ID prostřednictvím jiného mechanismu výměny (předcházení fixace session)
I když aplikace používá cookies, může akceptovat i jiné mechanismy výměny
Omezte akceptované mechanismy na cookies a testováním potvrďte, že jiné mechanismy neakceptujete
Zabezpečení transportní vrstvy
Použijte šifrované HTTPS (TLS) připojení pro ochranu výměny session ID
Podívejte se na možnost použití HSTS
Použijte atribut Secure
, čímž zajistíte výměnu pouze šifrovaným kanálem
Šifrovaná komunikace chrání session před útoky typu fixace session
Nepřepínejte session z HTTP na HTTPS nebo naopak (dojde k prozrazení session ID)
Zajistěte nastavení nebo obnovení po přesměrování při přesměrování na HTTPS
Nemíchejte šifrovaný a nešifrovaný obsah na stejné stránce nebo doméně
Vyhněte se veřejnému nešifrovanému obsahu a soukromému šifrovanému obsahu ze stejného hostitele
Zvažte hostování na samostatné nezabezpečené doméně, pokud je nezabezpečený obsah vyžadován
Implementujte HSTS pro vynucení HTTPS připojení
Více informací naleznete v cheat sheetu o zabezpečení transportní vrstvy
TLS nechrání proti predikci session ID, brute force atd., poskytuje však ochranu proti man-in-the-middle útoku
Cookies
Mechanismus výměny, který poskytuje řadu bezpečnostních prvků v podobě atributů souborů cookie
Atribut Secure
Dává prohlížeči pokyn, aby cookies odesílal pouze prostřednictvím šifrovaného HTTPS (SSL/TLS) spojení
Tím se předchází útokům typu man-in-the-middle a vyzrazení session ID
Útočník nemůže jednoduše zachytit session ID
Útočník může zachytit a zmanipulovat provoz oběti a zmocnit se / upravit session ID při používání nešifrované HTTP komunikace
Atribut HttpOnly
Instruuje prohlížeče, aby skriptům (Javascript) neumožňovaly přístup ke cookies prostřednictvím DOM (document.cookie
)
Tím se zabrání krádeži session ID prostřednictvím XSS a CSRF útoků
Atribut SameSite
Zabraňuje prohlížeči odesílat cookie při požadavcích na jiné stránky
Snižuje riziko úniku informací mezi stránkami
Poskytuje ochranu proti CSRF útokům
Atributy Domain
a Path
Domain
dává prohlížeči pokyn, aby cookies odesílal pouze do zadané domény a všech subdomén
Pokud není nastaven, bude cookies odesílat pouze na server původu
Path
dává prohlížeči pokyn, aby cookies odesílat pouze do zadaného adresáře nebo podadresářů (cest a zdrojů) v rámci aplikace
Pokud není nastaven, bude cookies odesílat pouze na cestu požadovaného zdroje
Použijte co nejužší a omezený rozsah pro tyto atributy
Nenastavujte atributy Domain
a Path
Nastavení Domain
na příliš obecnou (example.com
), umožňuje útočníkovi provádět útoky mezi různými hostiteli (cross-subdomain cookies)
Zranitelnosti na adrese example.com
mohou umožnit získání session ID z secure.example.com
Nemíchejte různé úrovně zabezpečení ve stejné doméně
Zranitelnost v jedné aplikaci by umožnila nastavení session ID v jiné aplikaci na stejné doméně (útok typu fixace session )
Nespouštějte různé aplikace na stejném hostiteli (zejména z různých úrovní zabezpečení nebo rozsahů)
Aplikace mohou k přístupu k session ID používat i jiné metody (document.cookie
)
Cookies jsou zranitelné vůči DNS spoofing / hijacking / poisoning útokům
Útočník může manipulovat s DNS resolution a donutit prohlížeč prozradit session ID hostitele nebo domény
Atributy Expires
a Max-Age
Pokud má cookie jeden z těchto atributý, je považována za trvalou a prohlížeč ji uloží na disk až do doby vypršení platnosti
Max-Age
má přednost před Expires
Funkce správy session, které umožňují sledovat uživatele po přihlášení, obvykle využívají neperzistentní cookies
Session z klienta zmizí po zavření prohlížeče
Používejte neperzistentní cookies, aby session ID nezůstávalo po dlouhou dobu v mezipaměti, odkud ho může útočník získat
Zajistěte, aby citlivé informace nebyly ohroženy
Neuchovávejte je trvale, šifrujte a ukládejte je pouze po dobu nezbytně nutnou
Zajistěte, aby prostřednictvím manipulace s cookies nedošlo k neoprávněným činnostem
Zkontrolujte, zda je nastaven Secure
příznak
Zajistěte, aby všechny stavové přechody v kódu kontrolovaly cookies a vynucovaly jejich použití
Zašifrujte celou cookie, pokud jsou v ní uloženy citlivé údaje
Definujte cookies, které aplikace používá - jejich název a důvod, proč jsou potřeba
HTML5 Web Storage API
Mechanismy pro ukládání name-value
párů / dat na straně klienta
Obsah není automaticky sdílen v rámci požadavků a odpovědí
localStorage
Data jsou přístupná stránkám, které mají stejný původ
Tím je dosaženo podobného přístupu k datům, jako při použití Secure
příznaku u cookies
Data v localStorage mohou být náchylná k problémům se sdíleným přístupem
Data by měla být považována za neuzamčená
Data zde uložená jsou uchovávána napříč sessions, čímž se prodlužuje doba, ve které mohou být přístupná ostatním uživatelům systému
Nevyžaduje šifrování dat, čímž je možné k datům přistupovat napřímo
Používejte localStorage pro data, ke kterým je potřeba přistupovat v různých oknech a kartách, ve více sessions a v případech, kdy je potřeba z výkonnostních důvodů ukládat velké objemy dat
sessionStorage
Ukládá dat v rámci kontextu okna - jedno okno nemůže přistupovat k datům druhého okna
Data jsou přístupná pouze stránkám, které mají stejný původ
Tím je dosaženo podobného přístupu k datům, jako při použití Secure
příznaku u cookies
Ukládá data pouze po dobu trvání aktuální session prohlížeče
Po zavření karty nelze data načíst
Nevyžaduje šifrování dat, čímž je možné k datům přistupovat napřímo
Používejte sessionStorage pro data, která jsou relevantní pro jednu instanci daného postupu (nákupní košík, rezervace letenek)
Web workers
Spouští javascriptový kód v globálním kontextu aktuálního okna
Alternativa pro ukládání secrets / session v prohlížeči (pokud není vyžadována perzistence při obnovení stránky)
Veškerý kód, který vyžaduje secrets, by měl existovat v rámci web workers
Secrets by nikdy neměly být přenášeny do kontextu hlavního okna
Poskytuje stejné záruky zabezpečení jako HttpOnly
u cookies
Umožňuje přístup k secrets v izolovaném javascriptovém kódu
Je to jediná možnost uložení dat v prohlížeči, která zachovává důvěrnost secrets
Životní cyklus session ID
Generování a ověřování session ID
Existují dva typy správy session - permisivní a striktní
Obě souvisejí se zranitelností fixace session
Permisivní mechanismus = umožňuje přijmout jakoukoli hodnotu session ID a vytvořit pro ni novou session
Zajistěte, aby aplikace za určitých okolností nepoužívala tento mechanismus
Striktní mechanismus = vynucuje přijetí dříve vygenerované session ID (nejčastěji používaný)
Nepřijímejte session ID, které jste nikdy nevytvořili
Vygenerujte nové platné session ID v případě obdržení takového session ID
Session by měla být zpracovávána serverem nebo generována pomocí kryptograficky zabezpečeného generátoru náhodných čísel
Spravujte session ID jako jakýkoli jiný uživatelský vstup