SessionID po přihlášení
- brabo
- Člen | 19
Zdravím,
po upgradu na novou verzi Nette nám přestalo fungovat přihlašování. Při bádání, proč se tomu děje, jsem zjistil, že to dělá zřejmě kus kódu
<?php
if ($session->authenticated) { // Session Fixation defence
$sessionHandler->regenerateId();
}
?>
v metodě
<?php
User->getSessionNamespace()
?>
Předpokládám, že je to ochrana proti nějakému druhu útoku. Problém je v tom, že naše aplikaci je silně svázána s databází, kde máme databázový kontext svázaný přes sessionId, takže změnou sessionId se nám napárování frontendu s databází pak ztrácí.
Přemýšlel jsem, jak tuto featuru potlačit bez zásahu do jádra Nette, ale bohužel jsem na nic nepřišel. Překrýt metodu getSessionNamespace() není úplně cool řešení, navíc to ani nejde, protože atribut User->session je privátní…
Ideální by asi bylo přidat do Usera příznak, jestli to měnění sessionId je vyžadováno.
- brabo
- Člen | 19
Díky za skvělý nápad, to by mělo jít – je zvláštní, jak často člověka úplně triviální řešení nenapadne :-)
Nicméně i tak mi přijde, že to přegenerováváná sessionID by mělo být nějak konfigurovatelné a mělo by jít vypnout.
_Martin_ napsal(a):
A nemůžete do session ukládat nějaké pseudo ID, které bude v rámci session neměnné, a to použít pro svázání s databází? Nevím, jak přesně to v aplikaci máte, ale toto se mi zdá jako možné řešení.
Editoval brabo (1. 1. 2009 12:20)
- paranoiq
- Člen | 392
jak se říká, každý problém má jednoduché a snadno realizovatelné špatné řešení. a právě takovým řešením by bylo vypnutí regenerace session id. session fixation je reálný bezpečnostní problém a pokud tomu Nette nekompromisně zabraňuje, pak je to jedině dobře. já jsem pro to, aby to vypnout nešlo
Editoval paranoiq (1. 1. 2009 14:53)
- David Grudl
- Nette Core | 8218
brabo napsal(a):
Předpokládám, že je to ochrana proti nějakému druhu útoku. Problém je v tom, že naše aplikaci je silně svázána s databází, kde máme databázový kontext svázaný přes sessionId, takže změnou sessionId se nám napárování frontendu s databází pak ztrácí.
Tomu dobře rozumím. Doporučil bych ale upravit postup tak, aby se vazba neprováděla přes sessionId, ale hodnotu, kterou do session uložíte. V podstatě to klidně může být (v tu chvíli aktuální) sessionId. Úprava aplikace by měla být velmi snadná.
Změna sessionId po příhlášení je hodně důležitý bezpečnostní prvek, jeho odstranění bych rozhodně nedoporučoval.
- Ondrej
- Člen | 110
David Grudl napsal(a):
Změna sessionId po příhlášení je hodně důležitý bezpečnostní prvek, jeho odstranění bych rozhodně nedoporučoval.
Se zmenou sessionId po prihlaseni souhlasim, ale ted se meni sessionId pri kazdem nacteni stranky! Pokud klikam moc rychle (hlavne v IE) tak se pozadavek odesle 2× se stejnym sessionId, protoze prohlizec nestihne dostat nove cookies. Vlivem druhemu pozadavku dojde k odhlaseni, protoze sessionId uz neni platne.
Jestli je to feature, tak se primlouvam za moznost tuto funkci vypnout.
- David Grudl
- Nette Core | 8218
To je fakt, že při pomalejším spojení může k podobné kolizi dojít, nechám regeneraci jen v okamžiku přihlášení/odhlášení.
Změněno v poslední revizi