Tech Life

Ilustrační obrázek

Bez práce nejsou koláče

27. 07. 2009 15:15    kategorie: Tech Life    autor: PTr    komentářů: 1

Cookies jsou bezpochyby užitečný vynález. S jejich pomocí si můžeme u návštěvníků schovat menší množství dat, která potom prohlížeč za určitých podmínek posílá webovému serveru zpět. Webová aplikace si tak může uložit uživatelské nastavení, obsah nákupního košíku, nebo jen identifikátor uživatele (resp. sezení). Základním předpokladem je, že co do cookie uložíme, to také získáme. Od Tomcatu verze 5.5.26 a 6.0.16 to už neplatí.
 

Představme si otisk nějakého řetězce získaný hashovacím algoritmem SHA-1. Protože je otisk polem binárních dat, převedeme ho do kódování Base64. Výsledkem je například řetězec 8C10yn0MfC13OV5ty2vXhv+B0c=, který uložíme do cookie pod názvem authToken. Když se pokusíme získat data zpět, čeká nás hluboké zklamání při pohledu na zkrácenou verzi W8C10yn0MfC13OV5ty2vXhv+B0c. Honbu za ztraceným rovnítkem zahájíme u webového prohlížeče.

Z kontroly uložených cookie vyplývá, že k problémům dochází po odeslání dat webovému serveru; správce cookies v prohlížeči totiž obsahuje nezkrácený řetězec. Pozornost proto přesuneme k hlavičkám. Při ukládání cookie odesílá server hlavičku
Set-Cookie: authToken=W8C10yn0MfC13OV5ty2vXhv+B0c=; Path=/
a následně prohlížeč hodnotu vrací
Cookie: authToken=W8C10yn0MfC13OV5ty2vXhv+B0c=

Na první pohled je patrné, že určité znaky mají zvláštní význam: mezi ně patří i rovnítko, které odděluje název cookie od její hodnoty. Starší verze Tomcatu se dokázaly s podobnými situacemi vypořádat, ale právě od 5.5.26 a 6.0.16 bylo z bezpečnostních důvodů chování upraveno. Při čtení řetězce teď získáme jen hodnotu do prvního výskytu rovnítka.

Je na čase si ukázat, co s tím. Jednou z možných cest je přestat používat zastaralou Netscape specifikaci cookies a přejít k modernější RFC 2109. To obnáší pouze zavolat metodusetVersion třídyjavax.servlet.http.Cookie se správným parametrem.
Cookie cookie = new Cookie(cookieName, cookieValue); cookie.setVersion(1);

Řetězce v hlavičkách jsou potom uzavřeny do uvozovek a tak máme se speciálními znaky starostí méně.
Set-Cookie: authToken="W8C10yn0MfC13OV5ty2vXhv+B0c="; Version=1; Path="/"
Cookie: authToken="W8C10yn0MfC13OV5ty2vXhv+B0c="

Problém je vyřešen jen do doby, než nás napadne k prohlížení webu využít Internet Explorer 7. Tomu totiž vadí cesta (atribut Path v hlavičce Set-Cookie) uzavřená do uvozovek, pro jistotu tedy cookie neodesílá serveru vůbec.

Univerzálnější řešení obnáší zůstat u Netscape specifikace a transformovat hodnotu cookie do URL kódování. Po každém načtení cookie je sice potřeba data dekódovat, ale získané hodnoty budou odpovídat těm uloženým o poznání častěji.

Sdílet odkaz:
tisk

Diskuze k článku

Anonym, 25.8.2009 18:32

Ad IE7 - resite tady naprostou amaterskou vec. Ten problem s IE7 zna snad kazdy programator, resi se to vlastni hlavickou Cache-control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0, private

Jinak ostatni je spise odrazeni pro uziti Tomcat, protoze tohle je uplne v pohode v PHP a mnoho enginu to resi zcela automaticky podle typu Agenta.

Přidat příspěvek

 

Kontakt pro média


Máte zájem o další informace, odborný článek či přednášku na konferenci? Kontaktujte nás prosím na pr@etnetera.cz.

RSS - Tech life


RSS kanál Tech Life Blogu

Offlineblog

Offlineblog

Ljama


Komix z prostředí imaginární firmy.

ljama

Ještě jste ho nečetli? Tak tudy ...

 
Doporučujeme: Nabídka práce, volná pracovní místa - pracovní portál SPRÁVNÝKROK.CZ