getprotected
Transkript
getprotected
VYSOKÁ ŠKOLA EKONOMICKÁ V PRAZE Fakulta informatiky a statistiky Katedra informačního a znalostního inženýrství Metody udržování stavových informací v protokolu HTTP Bakalářská práce Michal Hauzírek Vedoucí práce: PhDr. Otakar Pinkas Září 2004 Poděkování Rád bych tímto poděkoval vedoucímu své práce PhDr. Otakaru Pinkasovi za podporu při její tvorbě a mnohé cenné podněty. Prohlášení Prohlašuji, že jsem bakalářskou práci vypracoval samostatně a že jsem uvedl všechny použité prameny a literaturu, ze které jsem čerpal. V Praze dne 2. září 2004 Michal Hauzírek Abstrakt Tato bakalářská práce se zabývá metodami udržování stavových informací v prostředí služby WWW za užití protokolu HTTP. Jejím cílem je v teoretické části zejména zmapovat nejpoužívanější metody udržování stavových informací a jejich výhody a nevýhody. V úvodní části je jednak v souladu s technickými specifikacemi dokumentů RFC popsán samotný protokol HTTP a také důvody, proč v něm není přítomna podpora práce se stavy. Po historickém shrnutí vývoje služby World Wide Web a protokolu HTTP je diskutována potřeba přenosu stavových informací v prostředí WWW. Je konstatováno, že při udržování stavových informací na serveru je rovněž nutno udržovat na straně klienta a přenášet informaci identifikační. Základní metody přenosu informací tak mají opodstatnění v obou případech. Následuje přehled těchto metod. Ty jsou rozděleny do tří skupin. V první jsou ty, které využívají pouze vlastností protokolu HTTP. Sem patří zejména různé způsoby zakódování informací do URI či jejich odesílání metodou POST. Druhá reprezentuje rozšíření protokolu HTTP a v jejím rámci jsou popisovány tzv. cookies. Práce se zabývá jak jejich technologickými záležitostmi, jako jsou jejich jednotlivé varianty a obecná funkčnost, tak také některými dalšími okolnostmi zejména ochrany soukromí. Ve třetí skupině jsou pouze krátce naznačeny některé ostatní metody. V závěru teoretické části je v souvislosti s udržováním stavových informací na serveru a nutností ochrany identifikátoru naznačeno několik typů možných bezpečnostních problémů a některých protiopatření. Praktickou část tvoří jednak testy podpory cookies v různých prohlížečích, ale zejména tvorba aplikace, s jejíž pomocí je možné lépe analyzovat metody užité k přenosu stavových informací na konkrétních serverech. Abstract This bachelor thesis concerns with methods of maintaining state information in the WWW environment using the HTTP protocol. Its aim in its theoretical part is to show the most frequently used methods of maintaining state information and their advantages and disadvantages. In the first part, I describe the HTTP protocol itself (according to the technical specifications in RFC documents) and I also note there some reasons for its statelessness. After historic summary of evolution of the World Wide Web service and the HTTP protocol, there is a discussion about need of maintaining states on the web. I note there the fact, that even when state is maintained on the server side, there must be some piece of information for identification purpose maintained on the client side. So there is always need for methods of transporting state information in both cases. The next text provides overview of those methods. I divided them into three groups. In the first group there are methods, that use only properties of the HTTP protocol. Those are in particular various ways of encoding information in URI or sending it via POST method. The second group represents extension of the HTTP protocol, and there I describe so-called cookies. That part concerns not only with their technological details (such as types of them and their general function), but also some other consequences especially concerning privacy. In the third group I briefly note some other methods. I suggest a few of potential security problems and some countermeasures the end of the theoretical part in connection with server-side state management and need of protection of the IDs. Practical part consists of my tests of cookies support in various browsers, and especially of implementing an application that makes it easier to analyze various methods of state information transport on particular web servers. Obsah Obsah Úvod................................................................................................................................................... 8 1 Protokol HTTP................................................................................................................................. 9 1.1 Základy HTTP........................................................................................................................... 9 1.2 HTTP 0.9................................................................................................................................. 10 1.3 HTTP 1.0................................................................................................................................. 11 1.3.1 Stavový řádek...................................................................................................................11 1.3.2 Hlavičky........................................................................................................................... 12 1.3.3 Metody............................................................................................................................. 13 1.4 HTTP 1.1................................................................................................................................. 14 1.4.1 Perzistentní spojení.......................................................................................................... 15 1.4.2 Podpora pro virtuální servery........................................................................................... 15 1.4.3 Určení délky..................................................................................................................... 16 1.4.4 Vyjednávání o obsahu...................................................................................................... 16 1.4.5 Spolupráce s proxy a cache.............................................................................................. 17 1.4.6 Další změny......................................................................................................................17 1.4.7 RFC 2616......................................................................................................................... 18 1.5 Shrnutí......................................................................................................................................18 2 Stavové informace.......................................................................................................................... 19 2.1 Bezstavovost protokolu HTTP.................................................................................................19 2.2 Potřeba udržování stavových informací v protokolu HTTP.................................................... 19 2.3 Stavové informace v prostředí WWW.....................................................................................20 2.3.1 Metody přenosu stavových informací.............................................................................. 20 2.3.2 Stavové informace dle významu...................................................................................... 21 2.4 Práce se stavovými informacemi v prostředí WWW mimo rámec HTTP...............................21 3 Přenos stavových informací prostředky HTTP...............................................................................23 3.1 Data zakódovaná do URI......................................................................................................... 23 3.1.1 Obecná východiska.......................................................................................................... 23 3.1.2 Data za názvem dokumentu............................................................................................. 24 3.1.3 Data před názvem dokumentu..........................................................................................25 3.2 Formulářová pole..................................................................................................................... 26 3.3 HTTP autentizace.................................................................................................................... 27 3.4 IP adresa...................................................................................................................................28 3.5 Hlavička From......................................................................................................................... 29 4 Cookies........................................................................................................................................... 30 4.1 Základní funkce cookies.......................................................................................................... 30 4.2 Specifikace Netscape............................................................................................................... 30 4.2.1 K původu termínu „cookie“............................................................................................. 31 4.2.2 Hlavička Set-Cookie........................................................................................................ 31 4.2.3 Chování klienta a hlavička Cookie.................................................................................. 33 4.3 RFC 2109.................................................................................................................................33 4.3.1 Okolnosti vzniku.............................................................................................................. 33 4.3.2 Nedostatky specifikace Netscape..................................................................................... 34 4.3.3 Neověřitelné transakce a cookies třetích stran................................................................. 34 4.3.4 Hlavní změny v RFC 2109...............................................................................................35 4.4 RCF 2965 a 2964..................................................................................................................... 36 Strana 6 Obsah 4.4.1 Nekompatibilita Internet Exploreru................................................................................. 37 4.4.2 Další diskutovaná témata................................................................................................. 37 4.4.3 Změny v RFC 2965.......................................................................................................... 38 4.4.4 Velké zpoždění a neúspěch RFC2965..............................................................................38 4.5 Cookies a ochrana soukromí....................................................................................................39 4.5.1 Cookies třetích stran a reklama........................................................................................ 39 4.5.2 P3P................................................................................................................................... 41 4.5.3 Mýty okolo cookies.......................................................................................................... 42 4.6 Test podpory v prohlížečích.....................................................................................................43 4.6.1 Testované prohlížeče........................................................................................................43 4.6.2 Základní možnosti uživatelského nastavení práce s cookies........................................... 43 4.6.3 Podpora cookies dle specifikace Netscape.......................................................................45 4.6.4 Podpora cookies dle RFC 2109........................................................................................47 4.6.5 Podpora cookies dle RFC 2965........................................................................................48 4.6.6 Shrnutí výsledků...............................................................................................................49 5 Udržování stavových informací na serveru.................................................................................... 50 5.1 Ukládání stavových informací ................................................................................................ 50 5.2 Ohrožení identifikátorů relací.................................................................................................. 50 5.2.1 Odhadnutí.........................................................................................................................51 5.2.2 Odposlechnutí z komunikace........................................................................................... 51 5.2.3 Hlavička Referer.............................................................................................................. 51 5.2.4 Některé možnosti ochrany před zneužitím identifikátoru................................................ 51 5.3 Shrnutí......................................................................................................................................52 6 A.S.I.A.T........................................................................................................................................ 53 6.1 Uživatelské rozhraní................................................................................................................ 53 6.2 HTTP klient............................................................................................................................. 53 6.3 Práce se stavovými informacemi............................................................................................. 54 6.3.1 Cookies.............................................................................................................................54 6.3.2 Formuláře......................................................................................................................... 55 6.3.3 Odkazy a URI...................................................................................................................55 6.4 Návrh aplikace......................................................................................................................... 56 Závěr................................................................................................................................................. 57 Rejstříky vložených tabulek a obrázků.............................................................................................58 Seznam použité literatury................................................................................................................. 59 Seznam použitých zkratek a termínů................................................................................................62 Strana 7 Úvod Úvod Služba WWW (World Wide Web) postavená mimo jiné na protokolu HTTP1 se stala bezesporu nejpopulárnější službou internetu vůbec. Zdaleka již neslouží pouze několika málo vědcům a zdaleka již také neslouží pouze pro publikování statických dokumentů. Jejím prostřednictvím je rovněž přistupováno k rozsáhlý aplikacím a bývá také užívána jako brána k některým ostatním službám internetu. S tím je však v rozporu od prvopočátků bezstavový charakter protokolu HTTP. S tím mám také vlastní zkušenosti i proto, že jsem také já osobně v minulosti s tvorbou webových aplikací již také několikrát přišel do styku a byl tak nucen se problematikou stavových informací do jisté míry prakticky zabývat. To byl také jeden z hlavních důvodů, proč jsem si právě tuto problematiku zvolil jako téma své bakalářské práce. Stavové informace je v takových případech nezbytné pro správné fungování těchto dynamických aplikací za pomoci protokolu HTTP nebo některých jeho rozšíření udržovat a přenášet. Právě metody udržování stavových informací v protokolu HTTP jsou tématem této práce. Jejím cílem je na vymezeném prostoru na pozadí vzniku a postupného vývoje protokolu HTTP popsat základní metody pro udržování a přenos stavových informací v prostředí služby WWW. V základním pohledu budou rozděleny na metody udržování na straně klienta a na straně serveru. Jak bude ukázáno, v praxi je ovšem při obou způsobech nutné zajistit přenos určitých informací mezi klientem a serverem. Zmíním se proto zejména o metodách přenosu. A to jak o těch velmi často užívaných, tak i o těch, jejichž použití připadá do úvahy spíše pouze teoreticky. U každé z metod se pokusím upozornit na její nevýhody a nedostatky a naproti tomu také na přednosti, kterými vyniká nad ostatními. Přitom budu do značné míry abstrahovat od otázek spojených s problematikou cacheování a omezím se zejména na otázky přímé komunikace výchozího klienta s cílovým serverem. Poměrně rozsáhle se v teoretické části hodlám zejména ve 4. kapitole věnovat rozšíření protokolu HTTP právě pro udržování a přenos stavových informací (tzv. cookies). Chtěl bych se tomuto tématu věnovat nejen z čistě technologického hlediska, ale také se dotknout souvislostí, které jednak vedly k praktickému ustrnutí jeho dalšího vývoje a také k relativně velké publicitě této problematiky mezi širší veřejností. Tomuto tématu bude věnována i menší část praktického příspěvku této práce – totiž otestování několika významných prohlížečů právě na podporu cookies. Zásadní podíl na praktické části si však vyžádá tvorba aplikace, která by měla usnadnit právě analýzu stavových informací na konkrétních serverech zejména co do metody jejich přenosu. 1 Jsem si vědom toho, že 'P' v této zkratce znamená protocol (tedy česky protokol) a užití tohoto slova spolu s ní je tak logicky nadbytečné. Toto spojení však nejen lépe zní, ale hlavně se takto objevuje i samotné originální specifikaci [43]. Budu jej tedy užívat v této práci i nadále. Strana 8 Kapitola 1: Protokol HTTP 1 Protokol HTTP Protokol HTTP je spolu s jazykem HTML a schématem URI2 jedním ze tří základních pilířů dnes zřejmě celosvětově nejpoužívanější internetové služby WWW (World Wide Web). Služba WWW se postupně vyvinula z prostředku pro sdílení zejména textových informací mezi vědci ve zcela nové médium, které slouží jako brána pro přístup k jiným službám a to již zdaleka ne pouze internetovým. Je to nyní mimo jiné také specifický marketingový kanál, kterým je možno oslovit široké spektrum zákazníků. Tato poměrně velice výrazná změna jak kvantitativní (počet serverů a koncových uživatelů), tak zároveň i kvalitativní (z toho se odvozující požadavky na funkce a vlastnosti) musely v průběhu času vést k určitým změnám a vylepšením v samotných základech WWW – tedy i v protokolu HTTP. 1.1 Základy HTTP Základní filosofie a funkčnost protokolu HTTP zůstala ve všech verzích stejná. Proto ji ukážeme na prvním místě a v dalších subkapitolách potom uvedeme pouze změny a dodatky, které byly k těmto základním principům dodatečně přidány. HTTP je bezstavovým (viz kapitolu 2) aplikačním protokolem. V prostředí internetu tedy tvoří nejvyšší vrstvu nad vrstvou transportní (tvořenou zejména protokolem TCP) a vrstvou síťovou (protokol IP). Komunikace je založena na principu klient/server. HTTP klient (často prohlížeč ale například i proxy server) naváže spojení s HTTP serverem a otevře přenosový kanál. Standardně je pro protokol HTTP na serveru vyhrazen port 80. HTTP neslouží pouze ke komunikaci s WWW servery, ale i ke komunikaci s některými dalšími typy serverů – například proxy. Samotná komunikace protokolem HTTP je založena na principu požadavek/odpověď (request/response). Klient po otevření přenosového kanálu odešle serveru požadavek, kterým mu sdělí, jaký dokument po něm vyžaduje. Server odešle klientu odpověď obsahující požadovaný dokument (resp. zprávu o chybě, pokud takový dokument z libovolného důvodu nemůže poslat3). Server po odeslání odpovědi přenosový kanál uzavře a spojení ukončí. Pokud si chce klient vyžádat od serveru další dokument, celý postup (včetně otevření nového přenosového kanálu4) se opakuje. Komunikace, jak byla popsána nemusí probíhat přímo mezi koncovým klientem (webovým prohlížečem uživatele) a cílovým serverem, na kterém se nachází požadovaný dokument. Mezi nimi může existovat několik prostředníků či zprostředkovatelů. Ti mohou, například v podobě proxy serveru, fungovat jako server ve vztahu k prohlížeči a jako klient ve vztahu k cílovému serveru (případně dalšímu prostředníkovi). Je také možné, že některý z prostředníků má požadovaný dokument uložený z některého z předchozích požadavků, které jím procházely. V takovém případě ho za daných podmínek5 může vrátit klientu (koncovému uživateli nebo předcházejícímu prostředníkovi) jako odpověď (tzv. caching). Popsané situace znázorňují následující obrázky. Obrázek 1 ukazuje situaci několika dotazů přímo na cílový server. Obrázek 2 požadavky několika koncových klientů, které procházejí přes proxy server. 2 Dříve se v souvislosti s WWW častěji užívalo v témž smyslu spíše termínu URL K této problematice viz [54] a [42]. 3 Může jít o prostý případ, kdy se požadovaný dokument na serveru nenachází, ale také například když k jeho získání nemá server (nebo klient) potřebná oprávnění. Nastat může i situace, kdy dojde na straně serveru k chybě apod. 4 S výjimkou tzv. perzistentního spojení definovaného v HTTP 1.1 (viz subkapitolu 1.4.1) případně v některých rozšířených implementacích HTTP 1.0. 5 Například stáří takového dokumentu, to, zda si jeho autor přeje, aby byl po cestě ukládán, zda koncový uživatel chce přijmout uloženou verzi dokumentu apod. Strana 9 Kapitola 1: Protokol HTTP Na obrázku 3 je zachycena situace, kdy je prostředníkem na cestě mezi koncovým klientem a cílovým serverem (CS) jiný proxy server, který pracuje také jako cache. V zobrazeném případě má tento server k dispozici dostatečně čerstvou uloženou kopii požadovaného dokumentu a proto ji může klientovi odeslat místo cílového serveru a ušetřit tak přenosové kapacity. Obrázek 1: Opakovaný požadavek v HTTP s vyznačením otevíraných spojení Obrázek 2: Použití proxy serveru Obrázek 3: Použití cache v HTTP 1.2 HTTP 0.9 První verze protokolu HTTP (v současnosti se o ní mluví jako o verzi HTTP 0.9 ač se tak původně nenazývala) byla velmi jednoduchá[5]. Pro původní účely tj. přenos hypertextu (textových dokumentů provázaných odkazy) protokol docela dobře postačoval. Základní struktura již byla naznačena výše. Formát požadavku sestával z jediné řádky textu. Na začátku bylo klíčové slovo GET, následovala mezera, potom adresa dokumentu bez jména serveru a portu tedy pouze její část s cestou tj. od znaku /. Celý požadavek byl zakončen znaky pro konec řádku (CR LF). Odpověď serveru tvořil samotný dokument v jazyce HTML. Jiný formát se nepředpokládal a ani nebyl dovolen. Prostý text měl být odesílán rovněž jako HTML dokument v tagu <PLAINTEXT>. Případnou chybu měl server oznámit stejným způsobem – odeslat HTML dokument s popisem chyby. V této verzi protokolu tedy nebylo možné nijak automatizovaně rozeznat úspěšný přenos od chyby, neboť jediný kdo mohl rozeznat výsledek, byl člověk, který si získaný dokument přečetl. Následuje jednoduchý příklad požadavku a odpovědi v HTTP 0.9 (požadavek je kurzívou): GET /index.htm <html> ... </html> Strana 10 Kapitola 1: Protokol HTTP 1.3 HTTP 1.0 Výše popsaný velice jednoduchý protokol si s sebou nesl několik problémů. Jedním z nich bylo to, že jediný způsob, kterým se klient mohl dozvědět délku získávaného dokumentu, bylo ukončení spojení se serverem6. S rozšiřováním požadavků na WWW (a vylepšováním jazyka HTML) vyvstal také problém s přenosem jiných typů dokumentů (zejména obrázků). Obrázky vložené v HTML dokumentech jsou samostatné soubory s vlastním URI – získávají se tedy samostatným HTTP požadavkem. Bylo proto žádoucí, aby klient mohl dopředu rozpoznat typ získávaného dokumentu a mohl ho odpovídajícím způsobem interpretovat7. Dalším problémem raných verzí tohoto protokolu je již zmiňovaná nemožnost automaticky detekovat chybu v komunikaci. Objevila se také potřeba určité interaktivity – tj. schopnosti zasílat serveru data pro další zpracování. Původní jednoduchý koncept HTTP 0.9 tak byl rozvinut do komplexnějšího protokolu označovaného jako HTTP 1.0. Tato verze je popsána v dokumentu RFC 1945[38] vydaném v únoru 1996. Tento dokument však není standardem ve smyslu, že by předepisoval správné postupy a metody práce HTTP 1.0. Jde o ex-post sepsaný dokument, který reflektoval soudobý stav implementace HTTP. Hlavní změny oproti HTTP 0.9 spočívají zejména v rozšíření odpovědi serveru z pouhého těla dokumentu o stavový řádek a hlavičky s meta informacemi. Také požadavek lze rozšířit o hlavičky, které jsou však nepovinné. 1.3.1 Stavový řádek Jeden z dříve nastolených problémů původní verze HTTP – totiž nerozlišitelnost chybového hlášení od dokumentu je od této verze řešena zavedením stavového řádku. Odpověď serveru již není pouze samotný dokument, předchází mu stavový řádek a většinou ještě hlavičky. Stavový řádek je první řádek odpovědi, který má přesně danou strukturu. Začíná označením použité verze HTTP tj. znaky HTTP/ s číslem verze v desetinném formátu (zde tedy 1.0). Následuje mezera a trojciferný kód, který udává výsledek operace. Stavový řádek pokračuje mezerou odděleným slovním popisem kódu a končí znaky konce řádku (CR LF). Klient tedy může automaticky podle kódu zjistit, jaký byl výsledek požadavku. Programu je srozumitelný číselný kód a uživateli může být zobrazen slovní popis8. Stavové kódy jsou rozčleněny do pěti tříd. Kódy začínající číslicí 2 (tedy čísla v rozmezí 200 až 299) značí úspěch. Počáteční číslice 3 potom uvádí přesměrování na jinou adresu. Čtvrtá třída znamená neúspěch způsobený chybou na straně klienta a poslední pátá chybu na straně serveru. Stavové kódy začínající jedničkou jsou vyhrazeny jako informativní a v HTTP 1.0 není žádný definován. Jinak RFC 1945 uvádí význam celkem patnácti kódů z ostatních tříd. Kódy dělitelné stem jsou obecné a reprezentují celou třídu. Pokud klient nerozumí některému konkrétnímu kódu, může jej interpretovat tak, jako by to byl právě tento obecný. Problém identifikace chyb byl tedy vyřešen stavovým řádkem. Další problémy, týkající se typu dokumentu a jeho délky řeší hlavičky. 6 Teoreticky by přicházela v úvahu kontrola obsahu a hledání tagu </HTML>, který značí konec HTML dokumentu. Tento způsob je však nevhodný hned z několika důvodů: zasahuje o úroveň níže pod samotný protokol. Navíc je použitelný pouze pro HTML dokumenty (a to ještě pouze ty se správnou strukturou). 7 Podobně jako GOPHER klient rozlišuje menu, textový soubor, binární soubor apod. 8 Případně může program podle kódu zobrazit jiný vysvětlující text například v jazyce uživatele. Strana 11 Kapitola 1: Protokol HTTP 1.3.2 Hlavičky Mechanismus hlaviček byl přebrán z podobného konceptu hlaviček internetové pošty. Hlavičky se odesílají před samotným dokumentem a každá je tvořena jedním řádkem textu. Hlavička sestává z názvu a hodnoty. Název a hodnota jsou odděleny dvojtečkou a celá hlavička je zakončena znaky pro konec řádku (CR LF). Od těla odpovědi respektive požadavku9 se hlavičky oddělují jedním prázdným řádkem (tedy kombinací znaků CR LF). Hlavičky poskytují dodatečné informace k přenášenému dokumentu a k požadavku respektive odpovědi. RFC 1945 uvádí základních šestnáct hlaviček10. V příloze D, kde jsou uvedeny některé další vlastnosti podporované pouze v několika implementacích, je jich potom dalších deset11. Podle toho, ke které části komunikace se váží, lze hlavičky rozdělit do čtyř skupin. Obecné hlavičky (General-Header) se váží pouze k danému spojení. V hlavičce Date je uvedeno datum jeho uskutečnění a hlavička Pragma byla určena pro případné prostředníky při spojení (konkrétně cache). Další skupinu tvoří hlavičky požadavku (Request-Header). Ty odesílá klient a týkají se tohoto konkrétního požadavku12. Kromě autentizačních údajů, identifikace klientského programu a hlavičky pro podmíněný požadavek jsou pro další kapitoly zajímavé zejména následující dvě hlavičky z této skupiny. První z nich je Referer13, která jako svou hodnotu obsahuje URI dokumentu, ze kterého byl uživatel na požadovaný dokument odkázán. Totéž platí i pro požadavky na vložené objekty (například obrázky), v tomto případě se jako referer odešle URI dokumentu obsahujícího tento objekt. Autor či správce webu tak může analýzou těchto údajů zjistit, odkud na jeho stránky návštěvníci přicházejí a v případě změny struktury webu může autory příslušných odkazujících stran informovat. Zároveň však může tato hlavička znamenat v jistých případech a při nesprávně navrženém zabezpečení webové aplikace určité riziko – viz kapitolu 5. Některé prohlížeče (také s přihlédnutím k určitému stupni „narušení soukromí“) umožňují tuto hlavičku neodesílat, případně odesílat ji v pozměněné podobě. Hlavička From by měla obsahovat elektronickou adresu uživatele zodpovědného za odeslaný požadavek. Původně měla zřejmě sloužit pro případné upozornění uživatelů, kteří zasílali určitým způsobem nesprávné požadavky. Dnes je ale používána jen v minimu případů (například automatické programy pro indexování apod.). V běžných případech není prohlížeči odesílána, neboť by tím docházelo k obdobné situaci jako u cookies třetích stran – viz dále (navíc zhoršené tím, že by byla odesílána s úplně všemi požadavky). A nejen to – internetová poštovní adresa může do jisté míry identifikovat konkrétního uživatele, navíc by na ni v důsledku takovéhoto rozšiřování začalo velmi rychle přicházet velké množství nevyžádané reklamní pošty. Třetí skupinou jsou hlavičky odpovědi (Response-Header). Ty umožňují serveru představit svůj software, přesměrovat klienta na jinou adresu, případně ho vyzvat k zadání autentizačních údajů. A konečně poslední skupinou jsou hlavičky, které se váží k tělu odpovědi respektive požadavku (Entity-Header). Ty popisují přenášený dokument – tedy jeho typ (Content-Type), dále datum poslední úpravy (Last-Modified), případné transformace (například komprimace) (Content9 10 11 12 13 Jak bude uvedeno dále, HTTP 1.0 umožňuje pomocí metody POST odesílat data také v požadavku. 2 general, 5 request, 3 response a 6 entity – viz dále rozdělení hlaviček 1 general, 4 request, 1 response a 4 entity – viz dále rozdělení hlaviček V případě hlavičky Referer jde však jistým způsobem spíše o požadavek předcházející – viz dále. Správný název by dle anglického pravopisu měl zřejmě být Referrer (tedy s dvěma 'r'), tato „chyba“ je však již vžitá a hlavně implementovaná v mnoha HTTP klientech i serverech Strana 12 Kapitola 1: Protokol HTTP Encoding) a samozřejmě délku v bytech (Content-Length). V případě, že délka není uvedena, platí nadále, že dokument končí ukončením spojení. 1.3.3 Metody HTTP ve verzi 1.0 rozšiřuje možnosti také tím, že zavádí dvě nové metody, kterými lze komunikovat se serverem. Kromě metody GET již známé z předchozí verze, to jsou metody POST a HEAD. V již jednou zmiňované příloze D dokumentu RFC 1945 jsou popsány mj. ještě metody pro vytváření a mazání souborů na serveru (PUT a DELETE). Odlišná metoda v požadavku způsobí odlišné zpracování tohoto požadavku serverem. Jméno metody tvoří první část prvního řádku požadavku. Pomocí metody HEAD klient serveru sděluje, že nechce získat tělo dokumentu ale pouze příslušné hlavičky. Odpověď na tuto metodu je tedy stejná (co se týče hlaviček a stavového řádku), jako kdyby požadavek přišel metodou GET, ovšem bez samotného těla dokumentu. To je výhodné například při testování platnosti odkazů, kdy je potřeba pouze zjistit, zda cílový dokument existuje a není třeba si vyžadovat jeho obsah. Oproti tomu metoda POST umožňuje klientu odeslat spolu s požadavkem (v jeho těle) data, která server zpracuje. Může jít například o data odeslaná z HTML formuláře. Jejich délka však musí být výslovně uvedena v hlavičce Content-Length a to z toho zřejmého důvodu, že zde nelze použít pro určení jejich délky konec spojení. Pokud by totiž klient během odesílání svého dotazu uzavřel přenosový kanál, nemohl by jím server vrátit svou odpověď. Pro odlišení požadavku verzí 0.9 a 1.0 se ve verzi 1.0 za adresu dokumentu vkládá mezerou oddělené označení verze ve stejném formátu, jaký je použit ve stavovém řádku odpovědi (tedy HTTP/1.0). V HTTP 1.0 totiž musí server počkat ještě na případné hlavičky. Opět následují dva jednoduché příklady požadavků a odpovědí ve verzi HTTP 1.0: GET /index.html HTTP/1.0 (prázdný řádek ukončující hlavičky) HTTP/1.0 200 OK Date: Wed, 1 Aug 2001 10:56:00 GMT Server: Apache/1.3.7 (FreeBSD) Content-Length: 29644 Content-Type: text/html; charset=iso-8859-2 (...) --------------------------------------------POST /index.php HTTP/1.0 Content-Length: 10 1234567890 HTTP/1.0 404 Not Found Date: Wed, 1 Aug 2001 11:00:29 GMT Server: Apache/1.3.7 (Win32) Content-Length: 301 Content-Type: text/html; charset=iso-8859-1 (...) Strana 13 Kapitola 1: Protokol HTTP 1.4 HTTP 1.1 Rychlý růst popularity služby WWW jak mezi koncovými uživateli, tak mezi poskytovateli obsahu, kteří se stále více rekrutovali z řad obchodníků (které samozřejmě lákal rostoucí počet uživatelů jako potenciálních zákazníků) s sebou přinášel, co se týče protokolu HTTP, zejména dva další problémy. Nebyly to problémy nové, oba lze snadno vystopovat již od počátků, ovšem dokud bylo uživatelů poměrně málo a přenášené HTML dokumenty relativně jednoduché, nijak výrazně se neprojevovaly. Prvním problémem je to, že jak již bylo řečeno a jak to dobře ukazuje Obrázek 1 na straně 10, během jednoho spojení je možné přenést pouze jeden dokument. Poměrně náročná operace navázání spojení tak musí být mnohokrát opakována v případech, kdy je k jednomu HTML dokumentu připojeno několik dalších dokumentů (zejména obrázků, ale i skriptů, souborů stylů, animací a podobně). Pokaždé je přenesen pouze jeden takový objekt a spojení je opět uzavřeno. Tímto způsobem se prohlížení takových graficky bohatých dokumentů stává pomalým a náročným na výkon. Další problém souvisí s tím, že v požadavku se nikde neobjevuje jméno serveru, které je součástí adresy dokumentu. HTTP klient si z úplné adresy dokumentu (například dotazem na DNS server) zjistí IP adresu koncového serveru a naváže s ním spojení. V požadavku se pak objevuje pouze část adresy za jménem serveru (a případným portem). Tato situace tedy předpokládá, že pro každé jméno serveru použité v URI, existuje jiná IP adresa14. Takto byl původní protokol skutečně koncipován. Problém však nastal v době, kdy se vlastnictví vlastního lukrativního doménového jména (samozřejmě spolu s na něm běžícím HTTP serverem) stalo prestižní či ještě o něco později módní záležitostí. Navíc se stále rostoucí oblibou WWW si chtěly společnosti vytvářet WWW servery nejen s názvy svých firem, ale rovněž s názvy značek svých výrobků. Někteří lidé zase toužili po doménovém jménu odpovídajícím jejich jménu skutečnému. Tato fakta ještě více zhoršila situaci, kdy začalo hrozit brzké vyčerpání dostupných 32-bitových IP adres15. Bylo tedy žádoucí umožnit na jedné IP adrese (na jednom portu) provozovat více oddělených virtuálních serverů s odlišnými doménovými jmény. Jinými slovy bylo potřeba do samotného protokolu HTTP nějakým způsobem dodat podporu pro doménová jména. Tyto dva důvody patřily mezi hlavní impulsy pro další verzi protokolu – HTTP 1.1. První z problémů byl vyřešen zavedením perzistentních spojení, druhý potom povinnou hlavičkou požadavku Host. Kromě toho byly do protokolu zakomponovány některé další vlastnosti jako například podpora vyjednávání o obsahu a částečných přenosů. V neposlední řadě do specifikace přibylo velké množství textu týkajícího se spolupráce s proxy a cache servery a rovněž jejich správným chováním. První schválenou a uveřejněnou verzí protokolu HTTP 1.1 je dokument RFC 2068 z ledna roku 1997 [39]. Ten byl nahrazen dalším dokumentem RFC 2616 uveřejněným v červnu 1999 [43]. Změny mezi těmito dvěma dokumenty nejsou zdaleka tak výrazné (číslo verze také zůstalo stejné tedy 1.1) a ještě o nich bude řeč. Oba dokumenty byly (na rozdíl od RFC 1945) vydány jako standardy IETF. 14 Pokud abstrahujeme od jiných portů, než výchozího tj. 80. 15 Tento problém nebyl způsoben pouze protokolem HTTP, ale má hlubší kořeny v samotném systému fungování a přidělování adres. Blíže k tomuto problému a jeho řešením, která se netýkají protokolu HTTP viz např. [34] Strana 14 Kapitola 1: Protokol HTTP 1.4.1 Perzistentní spojení V předchozích odstavcích naznačený koncepční nedostatek způsoboval při mnohonásobných opakovaných požadavcích potíže jak na straně klientů, tak na straně serverů a snižoval výkonnost na obou stranách (k dané problematice viz například [52]). Dobrým řešením se ukázalo být perzistentní spojení. Tím se myslí ta skutečnost, že server po odeslání odpovědi neuzavře ihned přenosový kanál, ale ponechá jej po nějaký (krátký) časový interval otevřený. Klient jím posléze může poslat další svůj případný požadavek16. Odpadá tím nákladné ukončování a znovunavazování spojení. Dle slov autorů standardu nebylo zejména kvůli možným problémům se staršími proxy servery možné identifikovat užití perzistentního spojení nějakou speciální hlavičkou. Ty by je totiž (jakožto jim neznámé) mohly přeposílat dál, přestože tento způsob práce sami nepodporují. Pokud by se potom spojily se serverem, který takto pracovat umí, mohly by s odesláním odpovědi čekat teprve do uzavření spojení s koncovým serverem, což by práci s nimi výrazně zpomalilo. Perzistentní spojení tak bylo zvoleno za výchozí stav pro verzi protokolu HTTP 1.1. Pokud kterákoli ze stran komunikace nechce použít perzistentního spojení, odešle ve své zprávě hlavičku Connection: close. V případě popsaném výše (starší proxy server) koncový server perzistentní spojení neužije, neboť požadavek na něho bude ve verzi HTTP 1.0, kde toto není implicitní. Perzistentní spojení je možné využít také k odeslání více požadavků bez nutnosti čekat na jednotlivé odpovědi (tzv. pipelining). Tím je možné také do jisté míry zlepšit efektivnost přenosu, nicméně ne všechny HTTP servery tuto možnost (korektně) podporují a to v některých případech může vést namísto ke zrychlení a zefektivnění komunikace k pravému opaku. Obrázky 4 a 5 znázorňují perzistentní spojení a pipelining (srov. s obrázkem 1 na straně 10). Obrázek 4: Opakovaný požadavek v HTTP při perzistentním spojení Obrázek 5: Opakovaný požadavek v HTTP při perzistentním spojení a pipeliningu 1.4.2 Podpora pro virtuální servery Druhý ze zásadních problémů, které se k předchozí verzi protokolu HTTP vázaly, byl vyřešen pomocí nové hlavičky požadavku17. Ta nese název Host a jejím obsahem je doménové jméno serveru (včetně případného portu), ze kterého klient požaduje zaslat odpověď. Tato nová hlavička je, na rozdíl od všech ostatních hlaviček požadavku, ve verzi 1.1 povinná. Pokud server obdrží HTTP 1.1 požadavek, který ji neobsahuje, musí odpovědět chybovým hlášením s kódem 400 – tj. „chybný požadavek“. Tak je možné úspěšně provozovat na jedné IP adrese velké množství virtuálních serverů. Pokud na konkrétní IP adrese není provozováno více virtuálních serverů, pracuje vše tak, jak bylo naznačeno dříve. Jestliže jich tam více existuje, software serveru podle hlavičky Host, kterou si 16 Tím se ovšem nic nemění na tom faktu, že každý z požadavků je nezávislý a s každým se zachází tak, jako by byl první. Protokol i tak zůstává bezstavový, jedinou změnou je, že se v jednom přenosovém kanálu „vyřídí“ více požadavků. 17 Jinou možností řešení, která se nabízela bylo přidání doménového jména přímo adresy požadavku resp. přechod na absolutní adresy v požadavku. Strana 15 Kapitola 1: Protokol HTTP přečte v požadavku, zvolí dokument například z odpovídajícího adresáře a ten vrátí. Standard RFC 2068 rovněž požaduje, aby s požadavky, které obsahují úplnou URI adresu (tedy včetně doménového jména), uměly pracovat nejen proxy18, ale také ostatní servery. V některé z potenciálních budoucích verzí HTTP by tak mohlo dojít k případnému úplnému přechodu na absolutní URI ve všech požadavcích. 1.4.3 Určení délky Již dříve bylo řečeno, že délka odpovědi se určovala nejprve uzavřením spojení ze strany serveru (což nebylo zcela vyhovující), později potom pomocí hlavičky Content-Length. Ta musí být samozřejmě odeslána již před samotným dokumentem. U statického obsahu není pro server problém zjistit velikost souboru, který bude odeslán. S příchodem dynamicky generovaných dokumentů však může nastat potíž. Ta spočívá v očividném faktu, že server nemusí předem vědět, jak dlouhý obsah bude (například externí aplikací či CGI skriptem) vygenerován. Pokud se jedná o poměrně malý objem dat, jehož generování navíc trvá velmi krátkou dobu, může server, na jeho skončení „počkat“ a odeslat jej celý najednou s příslušnou hlavičkou označující délku. Naproti tomu probíhá-li vytváření obsahu pomalu, nebo je-li dat velké množství, vznikají nepříjemné prodlevy. V takovém případě by určitým řešením byl jakýsi krok zpět, totiž neodesílat hlavičku s údajem o velikosti a data posílat postupně tak, jak jsou vytvářena. Klient by potom jejich délku určil koncem spojení. Tento přístup však není možný, bude-li využito výhod perzistentního spojení (viz výše). Po odeslání dokumentu se totiž spojení po nějakou dobu neuzavírá. HTTP 1.1 proto přichází s jiným řešením nastíněného problému. Tím je „chunked encoding“19 tj. jistý způsob zakódování přenášených dat tak, že jsou posílána po částech a každá z těchto částí je uvozena svou vlastní délkou. Délka kažné takové části se uvádí na samostatném řádku odpovědi jako hexadecimální číslo vyjadřující počet bytů této části. Následuje řádek s příslušnými daty. Úplný konec dokumentu je signalizován řádkem oznamujícím nulovou délku. Za ním mohou ještě následovat některé HTTP hlavičky týkající se přenášeného dokumentu (tzv. footer20). Použití tohoto způsobu přenosu se označuje hlavičkou Transfer-Encoding: chunked. Na rozdíl od předchozí verze, kdy byla délka určována hlavičkou Content-Length a v případě její nepřítomnosti ukončením spojení, v HTTP 1.1 je spektrum možností, jak určit délku mnohem pestřejší. Standard stanovuje následující pořadí. Odpovědi, u kterých nikdy není přenášeno žádné tělo dokumentu (např. odpovědi na HEAD či některé stavové kódy), končí ihned za hlavičkami. Pokud je použito výše popsané kódování, určí se délka podle něho. Jinak platí hlavička ContentLength a až poté ukončení spojení21. 1.4.4 Vyjednávání o obsahu V této verzi protokolu se objevuje několik hlaviček, které umožňují implementovat tzv. vyjednávání o obsahu (content negotiation). S rozvojem a rozšířením internetu a jeho globálním působením může být žádoucí, aby jeden zdroj byl dostupný v různých svých verzích (například jazykových). Kromě toho, pro přístup k WWW je možné používat různé prohlížeče na různých zařízeních, jejichž zobrazovací schopnosti nejsou stejné. Pomocí vyjednávání o obsahu mohou klient a server 18 Požadavek posílaný přes proxy server musí samozřejmě obsahovat doménové jméno cílového serveru. Toho je dosaženo právě uváděním absolutních URI v požadavcích. 19 z anglického chunk – kus, odřezek 20 V novější verzi HTTP 1.1 tj. RFC2616 je nazýván trailer. 21 Ve skutečnosti v této posloupnosti ukončení spojení předchází ještě přenos pouze určené části dokumentu (rozmezí bytů), kde je délka dána explicitně. Strana 16 Kapitola 1: Protokol HTTP poskytnout uživateli nejvhodnější podobu požadovaného zdroje (jazykovou mutaci, složitost grafiky apod.). RFC 2068 popisuje tři způsoby vyjednávání. Prvním je vyjednávání řízené serverem (serverdriven). V tomto případě server analyzuje hlavičky, které získal od klienta22 a na jejich základě (případně i z dalších informací23) se rozhodne, kterou z dostupných reprezentací vrátí. V případě klientem řízeného vyjednávání (agent-driven) server vrátí seznam dostupných reprezentací a klient automaticky jednu vybere, či umožní výběr přímo uživateli. Posledním způsobem je transparentní vyjednávání (transparent), které je kombinací obou předchozích. Blíže k této problematice viz [41]. Obrázek 6 ukazuje příklad vyjednávání o obsahu řízeného serverem24 způsobem, jakým je například použito ve vyhledávači Google <http://www.google.com/>. ... Obrázek 6: Příklad vyjednávání o obsahu v HTTP 1.4.5 Spolupráce s proxy a cache Nově je ve specifikaci HTTP 1.1 věnováno mnoho prostoru spolupráci klientů a serverů s proxy a zejména cache. Je zde definován model pro práci s uloženými dokumenty25 a mnoho hlaviček pro popis jejich vlastností užívaných právě k těmto účelům. Dále jsou uvedena standardní pravidla pro chování proxy a cache serverů a další hlavičky, které umožňují tato výchozí pravidla pro konkrétní dokumenty či požadavky měnit. Toto téma je zpracováno skutečně podrobně a svým rozsahem přesahuje okruh zájmu této práce. 1.4.6 Další změny Výše popsané nebyly ani zdaleka veškeré změny a novinky, které se v nové verzi objevily. HTTP 1.1 je poměrně velmi rozsáhlým a komplexním protokolem. Pro představu snad uveďme, že zatímco RFC 1945 má bez příloh 54 stran (s přílohami 60), tak RFC 2068 jich bez příloh má celých 150 (a s přílohami ještě o dvanáct více). I z těchto počtů je tedy zřejmé, že jsme zcela jistě nemohli vyčerpat kompletní přehled změn. Výše zmíněné jsou však těmi nejpodstatnějšími. Z těch zbývajících zde okrajově zmíníme ještě několik. Jak jsme již naznačili, byla zavedena podpora pro vyžádání a přenos neúplných dokumentů (pouze určité rozmezí bytů) například pro navázání stahování již částečně stažených dokumentů. Dále přibyly čtyři nové metody – již zmiňované PUT a DELETE a k nim nově ještě OPTIONS umožňující zjistit vlastnosti určitého dokumentu a TRACE, kde je jako odpověď vrácen požadavek tak, jak došel na cílový server. Celkový počet stavových kódů byl rozšířen na 37 a přibylo na třicet nových hlaviček. 22 HTTP 1.1 pro tento účel definuje zejména hlavičky Accept, Accept-Charset, Accept-Encoding a Accept-Language 23 Příkladně IP adresa klienta může být použita pro odlišení „domácích“ a „cizích“ návštěvníků. 24 Pro přehlednost jsou uvedeny pouze Accept- hlavičky a chybí povinná hlavička Host. 25 založený na expiraci (vypršení) platnosti či čerstvosti dokumentu a jeho validaci (ověření) Strana 17 Kapitola 1: Protokol HTTP 1.4.7 RFC 2616 V červnu roku 1999 byl vydán nový RFC dokument s číslem 2616 (164 stran bez příloh 176 s nimi), který nahradil předchozí specifikaci. V samotném protokolu nebyly provedeny zásadnější změny, šlo spíše o precizaci některých formulací (zejména ve vztahu k požadavkům na implementaci) a upřesnění několika detailů. Mezi metody přibyla jedna nová pro použití s proxy servery, která však nebyla blíže specifikována (jde tedy spíše o rezervování jejího názvu). Přibylo několik málo nových stavových kódů zejména mezi těmi ze třetí třídy26. Výchozí název kódu 302 byl pro lepší odlišení významu od kódu 301 přejmenován27. Několik málo nepříliš používaných hlaviček bylo zrušeno, a přibylo několik nových. Následuje souhrnný příklad užití protokolu HTTP 1.1. GET /index.html HTTP/1.1 Host: www.example.net Accept: text/html, image/png, image/jpeg, image/gif, */*;q=0.1 Accept-Language: cs;q=1.0, en;q=0.9, sk;q=0.5, de;q=0.1 Accept-Charset: iso-8859-2, utf-8, iso-8859-1;q=0.6, *;q=0.1 HTTP/1.1 200 OK Date: Wed, 1 Aug 2001 18:30:29 GMT Server: Apache/2.0.49 (Win32) Content-Type: text/html Transfer-Encoding: chunked Last-Modified: Wed, 1 Aug 2001 12:01:18 GMT 1c <html> <head><title>Doc</tit 1a le></head> <body>text</bod a y> </html> 0 1.5 Shrnutí V současnosti je tedy platným standardem ve zmiňované oblasti HTTP verze 1.1 dle specifikace v dokumentu RFC 261628. Ve svém celku se jedná o protokol poměrně komplexní29, přesto v něm zůstává velmi silně zakořeněný jeho původní účel – totiž jednorázový přenos dokumentů. Stále je protokolem bezstavovým, ovšem zejména díky popularitě služby WWW je dnes používán pro přístup ke službám a aplikacím, které jsou ze své podstaty stavové. Tento rozpor musí být samozřejmě určitým způsobem řešen a stavové informace je nutno mezi jednotlivými požadavky nějak udržovat. 26 Včetně kódu 306, u kterého stojí, že byl používán v dřívějších specifikacích a nyní je nevyužit a rezervován. V žádné z jmenovaných předchozích specifikací se však neobjevuje. Pochází pravděpodobně z některého z pracovních dokumentů, jak lze vysledovat např. z [8]. Odtud také vyplývá, že původní význam tohoto kódu zněl „switch proxy“. 27 301 – Moved Permanently (trvale přesunuto) 302 – původně Moved Temporarily (dočasně přesunuto) nyní Found (nalezeno) navíc přibyl nový kód 307 – Temporary Redirect (dočasné přesměrování) 28 Některá rozšíření protokolu jsou obsažena v dalších dokumentech například HTTP autentizace v RFC 2617[44]. 29 Některým zainteresovaným se kolem roku 1997 (i když první impulsy pochází již z roku 1995) začal zdát možná až příliš komplexní a složitý, navíc s malou možností rozšíření. Začali pracovat na návrhu HTTP-ng (next generation) [53]. Nemělo jít pouze o revizi stávajícího HTTP, ale o kompletní vícevrstvou architekturu, která by mimo jiné podporovala RPC (Remote Procedure Call – vzdálené volání procedur). Tato snaha však nebyla dotažena do konce (snad přišla příliš brzy) a byla ukončena na sklonku roku 1999. Strana 18 Kapitola 2: Stavové informace 2 Stavové informace 2.1 Bezstavovost protokolu HTTP Jak bylo již řečeno, protokol HTTP je protokolem bezstavovým. Klient ani server tedy po vznesení požadavku a transportu odpovědi nepřechází do jiného vnitřního stavu. Nepamatují si žádné informace, týkající se uskutečněného spojení30. To je výhodné zejména kvůli možné jednodušší implementaci jak klientů, tak i serverů. Není nutno řešit případné problémy s obnovením těchto informací při neočekávaném ukončení spojení nebo softwarové chybě. Konečným důsledkem tohoto přístupu je, že s každým požadavkem je ze strany serveru nakládáno tak, jako by byl prvním. Zde je na místě znovu připomenout, že (na logické úrovni) toto platí rovněž při perzistentním spojení, zmiňovaném v souvislosti s HTTP 1.1. Spojení sice zůstane otevřeno pro další požadavky, ovšem týká se to pouze nižších vrstev (transportní, síťové, …). Ostatní chování vnitřní logiky protokolu HTTP je nezměněné, jako kdyby spojení bylo uzavřeno a znovu navázáno. 2.2 Potřeba udržování stavových informací v protokolu HTTP Popsaná situace je zcela postačující pro původní poslání protokolu – přenos statických dokumentů na základě požadavku. Postupem času se však služba WWW stala zcela jistě nejpopulárnější ze služeb internetu. Poměrně mnoho nezkušených uživatelů s ní dokonce celý internet ztotožňuje [59]. Navíc skutečnost, že se díky konkurenčnímu boji staly nejrozšířenější webové prohlížeče z původně placeného softwaru bezplatnými (či přímo předinstalovanými v operačním systému), tento trend ještě urychlila. Služba WWW se tak zejména v polovině devadesátých let začala stávat mimo jiné i novým marketingovým médiem a mnoho (později velmi neúspěšných) společností založilo své obchodní strategie z velké části právě pouze na ní31. Kvůli vysoké míře dostupnosti, relativně dobré vybavenosti softwarem (prohlížeči) a poměrně nízkým potřebným výchozím znalostem32 se „pod křídla“ WWW začaly přesouvat i další služby internetu. Jmenujme například elektronickou poštu či vyhledávání v katalozích a informačních databázích. V poslední době se rovněž poměrně silně rozmohlo využití webového rozhraní pro přístup zaměstnanců k podnikovým informačním systémům. Zde je výhodou mj. zejména snadná změna verzí, neboť není nutné všem zaměstnancům instalovat nový software, změna se provede pouze na serveru. Všechny výše zmíněné operace – nákupy, práce s poštou, vyhledávání v databázích i práce v informačním systému – ovšem vyžadují pro svou plnohodnotnou funkčnost přes WWW přenos stavových informací. Takové nároky však protokol HTTP přímo může jen těžko uspokojit, neboť na ně není uzpůsobený. Jak bylo již řečeno, každý požadavek je ze strany serveru brán jako by byl první. Aby server (případně na něm běžící obslužný skript či aplikace), mohl takovéto informace získávat, je proto nutné, aby byly obsaženy přímo v požadavku. Toho lze dosáhnout několika možnými metodami. Každá z nich má své výhody a nedostatky, které se v následujícím textu budeme snažit zohlednit. 30 Myšleno vzhledem k následujícím spojením a k protokolu HTTP. Samozřejmě je pravděpodobné, že server zapíše informaci o uskutečněném požadavku do logu, či klient zaznamená čas přístupu tak, aby mohl potenciální budoucí požadavky na tentýž dokument učinit podmíněnými (např. hlavičkou If-Modified-Since). 31 tzv. dot-com se koncem devadesátých let ukázaly jako tragicky neúspěšné, společně se tzv. „splasknutím technologické bubliny“ čili vystřízlivěním investorů, obchodníků a konec konců i zákazníků z původního téměř bezbřehého nadšení a opojení informačními a komunikačními technologiemi. 32 Výchozí nastavení prohlížeče většinou umožňuje jeho přímé použití, kdežto kupříkladu nastavení poštovního programu pro příjem a odesílání zpráv vyžaduje jisté úsilí a určité znalosti. Strana 19 Kapitola 2: Stavové informace 2.3 Stavové informace v prostředí WWW Existuje několik možností, jak lze stavové informace během komunikace v prostředí WWW udržovat a pracovat s nimi. V základním pohledu mohou být informace buď přenášeny přímo s každým požadavkem a nebo mohou být udržovány na serveru. I v druhém případě, jak si ukážeme v úvodu kapitoly 5, která mu bude věnována a kde se zmíníme i o některých otázkách bezpečnosti přenosu stavových informací, je ovšem nutný přenos odpovídajících identifikátorů mezi serverem a klientem. V obou případech je tedy legitimní hovořit o metodách přenosu stavových informací. Tyto metody jsme se rozhodli pro přehlednost rozčlenit do několika skupin. Kritériem byl samotný způsob přenosu informací mezi oběma komunikujícími stranami. Dále jsme se rozhodli rozčlenit samotné přenášené informace na dva druhy a to podle jejich významu (viz již zmiňované identifikátory). Zde abstrahujeme od způsobu přenosu a zabýváme se tím, jaké informace jsou přenášeny. Ne všechny způsoby přenosu jsou totiž vhodné pro oba tyto druhy informací. 2.3.1 Metody přenosu stavových informací V nejhrubším pohledu lze metody pro přenos stavových informací v prostředí WWW rozdělit na tři velké skupiny. První, početně největší, skupinu tvoří metody využívající přímo vlastností protokolu HTTP. Patří k nim zejména různé způsoby zakódování informací do URI požadavku případně využití některých dalších informací dostupných z protokolu HTTP. Těmito metodami se bude zabývat kapitola 3. Druhá skupina obsahuje fakticky jedinou, ovšem co do technologie a také historie svého vzniku a vývoje velmi zajímavou metodu – tzv. cookies. Ta je jistým rozšířením protokolu HTTP určeným právě výslovně pro uchovávání stavových informací a také proto jí bude věnována samostatná kapitola 4. Třetí skupina obsahuje řešení, která se netýkají přímo protokolu HTTP či jeho rozšíření. Sem byla zařazena řešení, která jej jistými způsoby obcházejí. Z důvodu této specifičnosti se jim budeme věnovat pouze okrajově v závěru této kapitoly. Pro přehlednost zde uvádíme hierarchický soupis metod. Detailně k jednotlivým metodám viz následující kapitoly. Metody přenosu stavových informací v prostředí WWW • • • Prostředky protokolu HTTP • URI požadavku • za otazníkem (query) • virtuální adresář za dokumentem (path info) • virtuální adresář před dokumentem • skrytá formulářová pole • HTTP autentizace • IP adresa • hlavička From Rozšíření protokolu HTTP (cookies) • dle specifikace Netscape • dle RFC 2109 • dle RFC2965 Zcela mimo protokol HTTP • klientské skripty • vložené samostatné aplikace Strana 20 Kapitola 2: Stavové informace 2.3.2 Stavové informace dle významu Zde nám půjde zejména o to, jaký typ informací je shora popsanými způsoby přenášen. Přecházíme tu jaksi o úroveň výše – z úrovně přenosu dat v komunikačním kanálu v rámci HTTP, na úroveň logiky aplikace, která s takto přenášenými daty (zde již spíše informacemi) pracuje. Z hlediska významu nás budou zajímat dva druhy informací. První z nich jsou informace identifikační – tedy takové, které napříč přes několik HTTP požadavků identifikují jednotlivé uživatele (často je pro takový typ informace užíván termín session-id či česky – identifikátor relace). Tam, kde je požadováno důsledné odlišení uživatelů (například u rozhraní elektronické pošty, ovládání bankovního účtu apod.), je nutno brát v úvahu zejména bezpečnost použití takových identifikátorů. Tímto tématem a na jisté obecné úrovni ochranou před možnými útoky se zabývá kapitola 5. Druhou uvažovanou skupinu informací, které je také nutno přenášet prostředky protokolu HTTP tvoří informace jiné než identifikační. Nazvěme je transakčními, neboť se často váží k transakcím v dané konkrétní aplikaci. Může jít o identifikace transakcí, tak aby bylo víceúčelovému skriptu dáno najevo, kterou akci má provést, případně se může jednat o data poskytnutá aplikaci ke zpracování. Ve většině dynamických aplikací je také nutné tento typ informací udržovat. Často však pouze po relativně krátkou dobu po několik málo dalších požadavků. Udržované a přenášené informace jsme si tedy pro vlastní potřeby rozdělili na identifikační – ty, podle kterých aplikace rozlišují uživatele a transakční – ty ostatní, které je nutné udržovat a přenášet (nejčastěji se týkají uskutečňovaných transakcí). 2.4 Práce se stavovými informacemi v prostředí WWW mimo rámec HTTP Na tomto místě je velmi obecně pojednáno o možných způsobech práce se stavovými informacemi v prostředí služby WWW, které pro svou činnost neužívají protokolu HTTP či jeho rozšíření. Tato práce se těmito způsoby detailně nezabývá a uvádíme je zde pouze pro úplnost možností udržování stavových informací v prostředí WWW. S použitím klientských skriptů Je možné, že se autor webové aplikace rozhodne, že není potřeba (nebo to není možné33) odesílat stavové informace serveru, ale postačí pokud tyto budou uchovávány a zpracovávány přímo na klientském softwaru – tedy v prohlížeči. Toho lze dosáhnout použitím některého ze skriptovacích jazyků implementovaných v prohlížečích (nejčastěji různé verze JavaScriptu). Takové jazyky však z pochopitelných bezpečnostních důvodů samozřejmě nemají přístup k souborovému systému klientského počítače34. Data je proto nutné uložit jiným způsobem. Jeden z nich ač je poměrně funkční, má celou řadu nevýhod. Je jím ukládání dat dynamicky do dokumentu nahraného v „neviditelném“ HTML rámci (frame resp. iframe). Tento způsob je podrobně popsán např. v [24]. K zásadním nevýhodám patří již samotné použití skriptů, které je nutné velmi pečlivě odladit v různých verzích různých prohlížečů. Druhým zásadním nedostatkem je použití rámů. Je totiž nutno zabránit uživateli dosažení dokumentu jinak, než v tomto rámu. Toto je velmi problematické zejména pokud se uživatel na web dostává z externího odkazu (například z vyhledávače). Teoreticky je možné toto kontrolovat opět s použitím klientských skriptů, je to však způsob nanejvýš nevhodný. Navíc utvořit odkaz tak, aby 33 Například na serveru není nainstalována podpora pro skriptování. 34 nepočítaje v to různé chyby v implementaci Strana 21 Kapitola 2: Stavové informace se do prohlížeče nahrála stránka obsahující rámy a v nich požadované dokumenty (odlišné od výchozích pro dané rámy) je téměř nemožné. Jiným, na implementaci relativně snadnějším způsobem je použití klientských skriptů k ukládání do a čtení z cookies (k nim blíže viz kapitolu 4). Ty je ale zase možno v prohlížeči vypnout či omezit. Všechny tyto metody mají zásadní nevýhodu – ne všechny prohlížeče podporují klientské skriptování (resp rámy), případně je možné tyto funkce omezit či zcela deaktivovat. Záleží potom na konkrétní aplikaci, jak se takovou situací vyrovná. Pro zde popsané metody proto nelze vidět širší možnosti použití. Absence komunikace se serverem vylučuje jejich užití pro identifikační i transakční informace ve smyslu výše uvedených definic. Jedna z mála představitelných možností by byla personalizace vzhledu (např. nastavení barvy pozadí či textu35) na webech tvořených množinou statických stránek. Pomocí samostatných vložených aplikací Zcela jiný přístup k tvorbě webových aplikací představuje použití relativně samostatných často binárních programů, které jsou vloženy do webové stránky. Může jít o applety v jazyce Java, objekty Active-X, Flash či jiné. Takové programy jsou pomocí protokolu HTTP pouze přenášeny a fungují jako víceméně samostatné plnohodnotné aplikace. Z toho plyne, že mohou v rámci určených pravidel36 také navazovat síťová spojení a komunikovat pomocí nich. Tato komunikace se již nemusí řídit protokolem HTTP (a většinou se jím také neřídí). Spojení tedy může probíhat pomocí nějakého stavového protokolu a potřebná data mohou putovat oběma směry. Veškeré detaily záleží na konkrétní aplikaci. HTTP je v takovém případě použit pouze k distribuci, případně vyvolání spuštění (pokud jsou již staženy a uloženy na klientském počítači) samostatných aplikací. Proto zde nelze hovořit o udržování stavových informací v protokolu HTTP. Obrázek 7: Přenos informací mezi vloženým objektem a serverem mimo rámec protokolu HTTP 35 V dokonalejší formě by potom mohlo jít kupříkladu o uložení adresy kaskádového stylu popisujícího zvolený vzhled sady stránek. 36 Například u Java appletů je standardně z bezpečnostních důvodů možné komunikovat pouze se stejným serverem, ze kterého byl applet stažen; pro Active-X obdobné omezení neexistuje. Strana 22 Kapitola 3: Přenos stavových informací prostředky HTTP 3 Přenos stavových informací prostředky HTTP V této kapitole se budeme věnovat technikám užívaným k přenosu stavových informací a to pouze s využitím standardních vlastností protokolu HTTP v aktuální verzi (tedy 1.1). Kromě zakódování těchto informací do URI nebo těla požadavků metodou POST je to především využití některých specifických hlaviček. 3.1 Data zakódovaná do URI První reprezentant této skupiny metod využívá toho, že s každým požadavkem je na server odesílána část adresy (bez jména serveru a portu). Vhodnou úpravou této adresy je možné předat serveru či na něm běžícímu skriptu požadované informace. 3.1.1 Obecná východiska Tento způsob je velmi často používaným. Mezi jeho nesporné výhody patří skutečnost, že URI je skutečně podstatnou součástí požadavku a proto jej musí podporovat všechny prohlížeče a není jej tedy možné vyřadit z činnosti deaktivací některých funkcí (na rozdíl od například cookies, či některých hlaviček). Aplikace, která spoléhá čistě na tento způsob tedy bude fungovat ve všech prohlížečích na všech platformách37. Navíc je možné tímto způsobem přidat stavové informace do libovolného hypertextového odkazu (na rozdíl od dále uváděných formulářových polí). Právě proto, že je tento způsob tak těsně spjat se samotným jádrem HTTP, má bohužel také řadu nevýhod. Jednou z nich je, že požadované URI je na serveru a na případných prostřednících (proxy) velmi často zapisováno do logovacích souborů. V URI tak rozhodně není vhodné přenášet nejen důvěrná data (což v prostředí internetu platí obecně o jakémkoli přenosu, pokud není zajištěn spolehlivými kryptografickými postupy), ale tento způsob není bez dalších opatření zcela vhodný ani pro přenos informací identifikačních (ve smyslu identifikátorů relace). Problém ještě komplikuje zmiňovaná hlavička Referer, která může způsobit odeslání aktuálního URI (včetně v něm zakódovaných informací) na cizí server (viz kapitolu 5). Další nevýhody spočívají na straně klientů. Protože URI je původně určen k identifikaci umístění dokumentu a jeho získání nejčastěji metodou GET, zachází s ním prohlížeče odpovídajícím způsobem. Tím je myšleno mimo jiné například ukládání do historie navštívených stránek. Pokud jsou v URI přenášeny transakční informace (viz subkapitolu 2.3.2), může mít v případě nedokonalého návrhu opětovné vyvolání URI z historie na chování aplikace neočekávané důsledky38. Situace není z tohoto pohledu o mnoho lepší ani v případě identifikačních informací. Pokud má být aplikace bezpečná a zahrnuje v sobě automatické vypršení platnosti relace, uživatel bude nemile překvapen, pokud si takovou adresu uložil mezi své oblíbené adresy. Po určité době (dle konkrétní aplikace) bude odkaz neplatný, respektive bude ukazovat na zcela jiný dokument – v lepším případě informující o nastalé situaci. Kombinace předchozích případů (tj. buď vypršení nebo použití identifikátoru jiným uživatelem s případnou kontrolou např. IP adresy) nastane, pokud se uživatel rozhodne o daném dokumentu informovat jiného uživatele a takovéto URI mu pošle. S tím souvisí i další – na první pohled možná spíše úsměvný, ale rovněž relevantní argument proti zakomponovávání stavových informací do 37 V extrémních případech by bylo lze uvažovat omezení spočívající v maximální délce URI. 38 Ačkoli ve specifikaci HTTP se uvádí, že požadavek metodou GET by neměl mít žádné jiné vedlejší účinky než pouhé odeslání požadovaného dokumentu, v praxi se tak ale nezřídka děje. Jazyk HTML rovněž poskytuje možnost nechat data z formuláře odesílat pomocí metody GET. Strana 23 Kapitola 3: Přenos stavových informací prostředky HTTP URI. Totiž, že tam jsou „moc na očích“. Dlouhá URI plná mnoha zdánlivě nesmyslných znaků se těžko pamatují, těžko opisují (rozuměj na papír, kam je nelze zkopírovat) či diktují39. Kromě toho někdy mohou taková snadno viditelná data lákat k úmyslné modifikaci a pokusu o primitivní útok na zabezpečení aplikace. Tento obecný popis charakterizoval veškeré způsoby přenosu informací v URI, v praxi se užívají nejčastěji následující dva: za prvé, data jsou za adresou dokumentu (v části query – za otazníkem) a za druhé, data tvoří název virtuálního adresáře za názvem skriptu. Zajímavým řešením je také umístění dat sice také do názvu virtuálního adresáře, ale před samotný název dokumentu. 3.1.2 Data za názvem dokumentu za otazníkem Tento případ bývá užíván nejčastěji, neboť nevyžaduje žádné náročnější nastavení webového serveru a funguje vlastně stejně jako odesílání HTML formulářů metodou GET. Požadovaná data se buď přímo umístí na konec URI a od názvu dokumentu (resp. skriptu) se oddělí otazníkem, nebo jsou zakódována tak, jak se odesílají formulářová data tj. název proměnné, znak rovnítka, hodnota proměnné a případný další název proměnné oddělený znakem ampersandu (&). Je samozřejmě možné používat jiný způsob kódování40, ale tento je velmi rozšířený a je přímo podporován (zejména extrakcí dat do proměnných) mnoha implementačními prostředími pro webové aplikace. Tento způsob je velice vhodný zejména pro transakční informace, bývá ale velmi často užíván zároveň pro informace identifikační a to zejména pro svou plnou kompatibilitu s HTML formuláři a vestavěnou podporou v prostředích. Následuje několik příkladů, jak je možné data tímto způsobem do URI zapsat: http://www.example.net/uriquery1.php?quido http://www.example.net/uriquery2.php?user=quido&lang=cs http://www.example.net/uriqyery3.php?97f9e7af1bc95c766e8b0e6be0e31a76 jako součást cesty Druhým způsobem přenosu dat za názvem dokumentu je jejich zapsání jako virtuální adresářové cesty ovšem až za názvem skriptu. Jednotlivé proměnné je potom možno oddělovat jako samostatné adresáře. Správně nastavený server pak v URI rozezná existující dokument a další virtuální cestu neinterpretuje jako adresářový strom, ale předá ji spuštěnému skriptu v proměnné, která dle specifikace CGI nese název PATH_INFO. Skript potom může s touto proměnnou snadno dále pracovat. Zmiňovaný přístup se již tolik nehodí pro informace transakční (obtížnější převod na proměnné), bývá však užíván pro přenos identifikátorů. Zde je opět krátký příklad znázorňující popsaný způsob (resp. kombinaci obou): http://www.example.net/uripinfo1.php/quido http://www.example.net/uripinfo2.php/quido/cs http://www.example.net/uripinfo3.php/f7712875b0bb78f1d743331bfcad61dd http://www.example.net/urimix1.php/quido?lang=cs Nevýhodou obou předchozích řešení je, že každý dokument na celém webu, v rámci něhož chceme udržovat stavové informace, musí být dynamicky generován. Důvodem této podmínky je 39 Jak se píše ve specifikaci [42], URI není posloupnost oktetů, ale posloupnost znaků neboť může být přenášeno mnoha různými způsoby (po síti, na papíře, hlasem, …). 40 Například takové, kdy je k oddělení proměnných použito jiného znaku. Znak & je totiž v HTML užíván pro označení entit a v odkazech by se tedy měl nahrazovat sekvencí &. Strana 24 Kapitola 3: Přenos stavových informací prostředky HTTP skutečnost, že je nutné informace uchované v URI jednoho dokumentu zanést také do odkazů na další dokumenty. Ztráta těchto informací v jednom požadavku by totiž znamenala jejich ztrátu i pro všechny následující požadavky. Dynamicky tak musí být upravovány všechny hypertextové odkazy uvnitř daného webu a také URI ukazující na cíl odeslání dat z HTML formulářů41. Nutnost takového neustálého přegenerovávání dokumentů může vést ke snížení výkonu celé aplikace. Navíc u jinak zcela statických dokumentů (klasickým příkladem je nápověda k systému42) se může takováto činnost zdát jako zbytečné plýtvání43. 3.1.3 Data před názvem dokumentu Jiný způsob, jak pomocí URI udržovat stavové informace, využívá podobného principu, jako výše popsaná technika s PATH_INFO. Na rozdíl od ní, je ale virtuální adresář umístěn před samotný název dokumentu. Ač se to na první pohled nezdá o mnoho výhodnější, jedna nesporná výhoda tu je. Pokud totiž v dokumentu použijeme v odkazech relativní adresy, není nutné jejich přegenerovávání. Protože data tvoří virtuální adresář vyšší úrovně, ten při použití relativních odkazů, které nad tuto úroveň nezasahují, zůstane zachován. Zpracování adresy skriptem je zde lehce obtížnější. Celá adresa požadavku může být získána například z proměnné REQUEST_URI, odkud lze poté dotyčná data extrahovat. Tento způsob je vhodný pouze pro přenos identifikátoru, který není příliš často měněn, neboť jinak by se jeho výhoda ztrácela. Častá změna během relace by nutně musela vést opět k přegenerovávání odkazů. Pro správnou funkci je zde nutný zásah do konfigurace serveru44 tak, aby virtuální adresáře nebyly považovány za součást stromové struktury. Požadovaná URI si tak musí server správně přeložit na interní adresy existujících dokumentů. K tomu složí například v HTTP serveru Apache[1] modul mod_rewrite. Následující příklad ukazuje jeho možnou jednoduchou konfiguraci (jedná se o fragment z konfiguračního souboru httpd.conf serveru Apache), která zaručí, že dokumenty v adresáři /store budou přístupné také o jeden libovolně nazvaný adresář hlouběji. Alias /store/ /var/www/store/ RewriteEngine On RewriteCond %{REQUEST_URI} /store/ RewriteRule /store/[^/]+/(.*)$ /store/$1 Tedy všechny následující URI budou ukazovat na stejný dokument: http://www.example.net/store/urivp.php http://www.example.net/store/quido/urivp.php http://www.example.net/store/--host--/urivp.php Je možné použít více podadresářů v adresáři /store. Ty budou v adrese za virtuálním adresářem. Následující dvě URI opět ukazují na stejný dokument. http://www.example.net/store/goods/urivp.php http://www.example.net/store/quido/goods/urivp.php 41 Pokud to není řešeno například skrytými formulářovými poli. Přesto se tento způsob vzhledem k tomu, že je tak jako tak nutno upravit odkazy, zdá výhodnější. 42 Ač je nutno poznamenat, že nápovědy obecně nebývají (bohužel) uživateli příliš často čteny. 43 Jistým řešením by bylo otevírání takových dokumentů v novém okně prohlížeče tak, aby v původním okně zůstaly vygenerované odkazy zachovány. Takovéto vynucené otevření nového okna se však nemusí setkat s přízní uživatelů a v některých (zejména textových) prohlížečích ani není proveditelné. 44 Což může být jedna z nevýhod této metody, neboť takový zásah není vždy možný (například na hostingových serverech externích poskytovatelů). Strana 25 Kapitola 3: Přenos stavových informací prostředky HTTP 3.2 Formulářová pole Ač takovéto pojmenování vede spíše k jazyku HTML než protokolu HTTP, nesporným faktem je, že data z formulářů jsou tímto protokolem odesílána. Nebudeme se zde podrobněji zabývat problematikou formulářů. Zmíníme se jen, že kromě klasických vstupních polí je možné do formuláře vložit také pole, která sice mají klasicky název a hodnotu, ale nejsou pro uživatele viditelná. Přesněji řečeno nemají v HTML žádnou grafickou reprezentaci. Vidět je lze samozřejmě zapsané ve zdrojovém textu. Formuláře je možné odesílat dvěma způsoby respektive HTTP metodami – GET a POST. Odeslání metodou GET probíhá tak, že do příslušného URI jsou za otazník zakódována formulářová data stejným způsobem, jak je uvedeno v prvním odstavci subkapitoly 3.1.3. V tomto případě jsou data vlastně odesílána zakódováním do URI a platí pro ně veškerá tvrzení tam uvedená. Pokud jsou data odesílána metodou POST, nejsou zapsána do URI, ale poslána (opět ve stejně zakódované podobě) v těle požadavku, jak je to popsáno v subkapitole 1.3.3. To má oproti předchozí metodě jisté výhody. Z těch hlavních to je zejména fakt, že tělo požadavku většinou nebývá zaznamenáváno do logů. Neznamená to však, že se jedná o zcela bezpečný způsob přenosu. Data jsou standardně přenášena po síti v otevřené formě a jsou zachytitelná. Pouze nejsou na tolika místech ukládána. Také prohlížeč uživatele často umí upozornit na případné opakované odeslání dat. Data odeslaná metodou POST se navíc neobjeví ani v hlavičce Referer. Identifikační informace je tedy možné vložit do skrytých polí a ta jsou potom spolu s případnými transakčními informacemi z běžných (či rovněž skrytých45) formulářových polí metodou POST odeslána. Tímto způsobem odeslaná data jsou běžnému uživateli skryta. To, že se taková „neviditelná“ pole nazývají skrytá (hidden), ale neznamená, že se k nim uživatel nemůže relativně snadno dostat a změnit je. Jak již bylo řečeno, jsou zapsaná ve zdrojovém textu, který umí zobrazit snad každý prohlížeč. Zásadním omezením, které limituje nasazení této metody je fakt, že celá oblast webu, kde chceme stavové informace takto udržovat, musí být mezi sebou propojena nikoli běžnými hypertextovými odkazy, ale formuláři. Pro přechod na jiné stránky musí být použito odesílacích tlačítek46. Kromě toho i zde platí nutnost dynamického generování všech stran – nyní nejsou generovány odkazy, ale hodnoty identifikačních skrytých polí. Tato metoda je teoreticky použitelná pro libovolný typ informací47. Ve své čisté podobě (tj. pouze formulářové propojení mezi stranami) je však ve většině případů nevhodná pro informace identifikačního charakteru (ač z hlediska bezpečnosti by byla vhodnější než URI). Užívá se tak spíše pro jednorázový přenos transakčních informací zpravidla získávaných od uživatele a zejména ve větším objemu (např. textové příspěvky, články či celé soubory). <form action="form.php" method="post"> <input type="text" name="hledat"><br> <input type="hidden" name="id" value="quido"> <input type="submit" name="co" value="Hledat"> </form> Obrázek 8: Fragment HTML kódu s formulářem se skrytým polem a jeho grafická reprezentace v prohlížeči 45 Například kód akce, která má být aplikací provedena může být také uložen ve skrytém poli aby byl uživatel odstíněn od aplikační logiky. Často se též pro takový kód využívá názvu a hodnoty odesílacího tlačítka formuláře, které je specifickým formulářovým polem. 46 případně obrázků 47 Obecně lze takto odesílat data delší než jaká se vejdou do URI, a to včetně souborů. Strana 26 Kapitola 3: Přenos stavových informací prostředky HTTP 3.3 HTTP autentizace Protokol HTTP obsahuje mechanismus, který umožňuje jednoduchým způsobem spolu s požadavkem odeslat také informace sloužící pro ověření přístupových práv k dokumentu[44]. Pokud je server vyžaduje pro zpřístupnění nějakého dokumentu či sady dokumentů, odešle v odpovědi stavový kód 401 (Unauthorized – neautorizováno48) a hlavičku WWW-Authenticate. Uživatel je prohlížečem vyzván, aby vyplnil uživatelské jméno a heslo. Ty jsou potom v hlavičce Authorization odeslány v novém požadavku serveru. Pokud jsou zadané údaje platné tj. klient neobdrží v další odpovědi opět stavový kód 401, údaje si dočasně49 uloží aby je mohl (kvůli bezstavovosti protokolu HTTP) odeslat spolu s dalšími požadavky na tentýž server již bez dalšího dotazování. Tento mechanismus by tedy bylo možné s výhodou použít pro identifikaci uživatelů. Jeho předností je, že je součástí samotného protokolu a je tedy podporován (alespoň ve své základní – Basic verzi50) v jeho mnoha implementacích jak na straně klientů, tak na straně serverů. Autentizační informace jsou odesílány automaticky a to v každém požadavku na dokument z příslušné části serveru. Nehrozí tak obdoba zbytečného přegenerovávání dokumentů. Existují ovšem rovněž nevýhody a to dosti podstatné. Mezi ty nejzásadnější patří skutečnost, že neexistuje jednoduchý způsob, kterým by se bylo možno odhlásit čili ukončit relaci – jinými slovy donutit prohlížeč, aby od určeného okamžiku přestal autentizační informace v požadavcích posílat51. Je tak velmi obtížné například přihlásit dalšího uživatele na stejném prohlížeči. Velkou komplikací je potřeba mít předem (tedy před přihlášením) uděleno uživatelské jméno – identifikátor. Z toho plyne, že není možné tuto metodu použít pro jednorázové odlišení uživatelů ještě před přihlášením (například v elektronickém obchodě). Protože budou uživatelé vypisovat uživatelská jména ručně, nemůže jít například o výstupy hašovacích funkcí. Ty jsou jinak právě pro tvorbu identifikátorů velmi vhodné kvůli konstantní délce a velké složitosti. Kromě toho může docházet ke kolizím mezi požadovanými a již zaregistrovanými jmény a podobně. Další nevýhoda spočívá právě ve faktu, že o zobrazení dialogu se stará prohlížeč. Tvůrce webové aplikace tedy nemůže upravit jeho vzhled tak, aby například odpovídal barevně, velikostí písma, nebo dokonce jazykově. Na rozdíl od webové stránky s formulářovými poli není možné vložit do takovéhoto dialogu ani nějaký vysvětlující text. Všechny tyto skutečnosti a navíc i to, že tato metoda nebývá užívána příliš často, vedou k tomu, že nezkušený uživatel může být odrazen. Popsaná metoda je tedy již ze své podstaty vhodná pouze pro informace identifikačního charakteru tj. uživatelské jméno. Lze ji však použít pouze v případech, kdy je toto vydáno uživateli předem. Již od základů je tento mechanismus navržený a určený pro situace, kdy je vhodné jednoduše zamezit přístupu neautorizovaných uživatelů k některým dokumentům. Jiné využití naráží na mnoho problémů a není proto vhodné. Zde je příklad HTTP komunikace s vyznačením autentizačních hlaviček: GET /protected.html HTTP/1.1 Host: www.example.net HTTP/1.1 401 Unauthorized 48 49 50 51 Často je také užíván popis „Authorization Required“ (požadována autorizace). většinou do uzavření prohlížeče Jméno a heslo jsou odesílána nezašifrovaně pouze v kódování Base64. Jednou z jednodušších možností je ukončení prohlížeče. To však rozhodně není možnost vyhovující. Strana 27 Kapitola 3: Přenos stavových informací prostředky HTTP Date: Wed, 1 Aug 2001 20:30:29 GMT WWW-Authenticate: Basic realm="chranena oblast" Unauthorized ----------------------------------------------GET /protected.html HTTP/1.1 Host: www.example.net Authorization: Basic bWljaGFsOmhhdXppcmVr HTTP/1.1 200 OK Date: Wed, 1 Aug 2001 20:31:05 GMT Content-Length: 315 ... 3.4 IP adresa Adresa IP samozřejmě není součástí protokolu HTTP. V této kategorii je však uváděna proto, že na rozdíl od dříve zmiňované třetí kategorie metod, se nejedná o mechanismus aplikovaný nad (jako klientské skripty), či vedle (jako vložené binární objekty) HTTP. V tomto způsobu uvažování lze říci, že IP adresa je pod HTTP – konkrétně až v síťové vrstvě. Tolik tedy pro upřesnění pozice této metody v tomto přehledu. Samotná IP adresa je 32-bitové číslo a nemůže tedy samo o sobě sloužit pro přenos nějakých dat. Server však má z pochopitelných důvodů k dispozici IP adresu klienta. Bylo by ji tak teoreticky možné použít k identifikaci a rozlišení klientů – tedy jako druh identifikátoru. Takový identifikátor by měl mnoho výhod. Byl by automaticky odesílán s každým požadavkem bez nutnosti nějakých softwarových úprav a byl by v prostředí internetu jen velmi obtížně podvrhnutelný. Nejedná se však (bohužel) ani zdaleka o identifikátor jednoznačný, což jej činí pro tento účel nepoužitelným. IP adresa klienta totiž může měnit – například dynamické přidělování adres s omezenou dobou platnosti domácím uživatelům je běžné. Mnoho klientů se také ke službám internetu připojuje přes proxy servery, a cílový server poté jako IP adresu klienta získá adresu posledního takového proxy serveru. Pokud by byla IP adresa použita jako identifikátor, například ve webovém rozhraní k elektronické poště, k dopisům jednoho zaměstnance by se dostali zaměstnanci celé firmy, která používá jediný proxy server a naopak na takovýmto způsobem řešenou anketu (s jedinou odpovědí na uživatele tedy IP) by mohl odpovědět pouze první z nich. Některé proxy-servery sice posílají hlavičku X-Forwarded-For, která obsahuje IP adresu prvního klienta, ale ani tak se nejedná o spolehlivý identifikátor. Jednak se tak nechovají zdaleka všechny a kromě toho je poměrně jednoduché takovou hlavičku odeslat ručně. O pár odstavců výše v souvislosti s nemožností použití IP adresy jako jednoznačného identifikátoru bylo slovo bohužel uvedeno v závorkách. Na tomto místě je vhodné vysvětlit, proč tomu tak bylo. Pokud by totiž toto bylo hypoteticky možné, čelili bychom zcela jistě problémům profilování uživatelů. Tedy v krátkosti vytváření individuálních profilů týkajících se jednotlivých uživatelů a jejich zájmů za účelem (v nejlepším případě pouze) přesnějšího zacílení reklamy. Blíže se k tomuto tématu vrátíme v souvislosti s tzv. cookies třetích stran v subkapitole 4.5.1. Tyto by ovšem byly mnohem závažnějšího rázu, neboť IP adresa nejen nelze „vypnout“ jako cookies, ale také zdaleka nesouvisí pouze s WWW. Strana 28 Kapitola 3: Přenos stavových informací prostředky HTTP IP adresa tedy (možná by se slušelo říci nyní naopak bohudík) nemůže být použita přímo jako identifikátor, velice dobře je ji ale možné použít ke zvýšení zabezpečení aplikací zejména při ochraně relací (viz kapitolu 5). 3.5 Hlavička From Zatímco předchozí metody byly prakticky použitelné alespoň pro některé případy52, tato mezi ně nepatří. Jedná se o metodu pouze teoretickou, neboť hlavičku From prohlížeče neodesílají. Objevuje se však ve specifikaci protokolu a proto se zde o ní zmíníme. Jak jsme již poznamenali, hlavička From by měla obsahovat adresu elektronické pošty uživatele, který požadavek vyslal respektive je za něj zodpovědný. Pokud by se takto prohlížeče chovaly, bylo by tuto adresu možno brát jako identifikátor uživatele. Oproti IP adrese by mezi výhody patřila unikátnost vzhledem k uživateli a možnost nastavení stejné adresy na více počítačích, pokud je uživatel má k dispozici. Samozřejmě by ale potom nebyl problém vložit do prohlížeče adresu cizí a tak se „za někoho vydávat“, čili spolehlivost by stejně byla velmi nízká. Zároveň by tato metoda trpěla podobnými nedostatky, jako některé z již zmiňovaných. Ohledně ukončení relace zde platí totéž, co bylo řečeno u HTTP autentizace – totiž že by nebyla možná. Stejně tak by se zde nepochybně vyskytly problémy s narušením soukromí obdobné těm již zmiňovaným v souvislosti s IP adresou, které budou ještě dále rozvedeny v kapitole o cookies. Na závěr uvedeme tabulku, která shrnuje vhodnost jednotlivých metod pro dané typy informací. Plyne z ní, že z metod pro přenos stavových informací založených čistě na samotném protokolu HTTP je pro transakční informace vhodné použít zejména jejich zakódování do URI do části query, případně je odesílat v těle požadavku metodou POST. Pro práci s informacemi identifikačními přicházejí v úvahu veškeré způsoby zakódování do URI (s vědomím příslušných problémů) a rovněž skrytá formulářová pole. Tabulka 1: Vhodnost metod přenosu prostředky HTTP pro různé typy informací Metoda Identifikační informace Transakční informace ANO ANO ANO spíše NE ANO NE Formulářová pole ANO (skrytá) ANO HTTP autentizace částečně NELZE spíše jako zabezpečení jiné metody NELZE v praxi NE NELZE za otazníkem Data virtuální adresář za názvem v URI virtuální adresář před názvem IP adresa Hlavička From 52 Použití IP adresy jako identifikátoru je sice z výše zmíněných důvodů krajně nevhodné, ale teoreticky možné. Strana 29 Kapitola 4: Cookies 4 Cookies Jak bylo vidět v předcházející kapitole, udržování stavových informací prostředky protokolu HTTP s sebou nese některé problémy a žádná z tam popisovaných metod není bez nedostatků. Během rozvoje služby WWW a nároků na ní kladených proto byl vyvinut mechanismus, který obohacoval protokol HTTP o jistou podporu práce se stavovými informacemi. Tento mechanismus však začal být také zneužíván k jiným než původním účelům, což vedlo v poslední třetině devadesátých let k vášnivým diskusím a vzrušení nejen v řadách odborníků, ale také u poměrně široké veřejnosti. Tato „aféra“ měla dosah až do vysokých politických kruhů. V této kapitole se budeme zabývat zejména vývojem a technickými detaily popisovaného mechanismu, ale nevyhneme se ani ostatním naznačeným souvisejícím tématům. 4.1 Základní funkce cookies Cookies mají sloužit k překonání bezstavovosti protokolu HTTP a přitom se do něho snaží co nejméně zasahovat. Celý mechanismus je založen na stejném základním principu, který již byl formulován v závěru subkapitoly 2.2 – aby mohly být v protokolu HTTP udržovány stavové informace na straně klienta, musí tyto být uvedeny v každém požadavku odesílaném serveru. V tomto případě se tak děje prostřednictvím zvláštních hlaviček odpovědi resp. požadavku SetCookie a Cookie53. První krok je na serveru, který může klientovi v odpovědi odeslat právě hlavičku Set-Cookie a v ní nějaká data, která si má klient zapamatovat. Ten je poté odesílá na server zpět s každým požadavkem podle definovaných pravidel v hlavičce Cookie. Velmi často se jedná právě o informace identifikačního charakteru, protože ale server může v dalších odpovědích odeslat další hlavičky Set-Cookie, které buď přidají další data, nebo stávající data změní, je možné takto uchovávat i některé typy transakčních informací. Notorickým příkladem (zmiňovaným již ve specifikaci) je zde virtuální nákupní košík obsahující položky vybrané v elektronickém obchodě. Cookie je tedy (většinou velmi krátký) textový řetězec, který HTTP server odešle klientovi a ten si jej uloží a nadále posílá zpět serveru s každým dalším požadavkem. Tolik tedy k základním principům, které schematicky znázorňuje také obrázek, a které jsou platné pro všechny verze cookies. Ty nyní budou postupně popsány a rozebrány. Obrázek 9: Obecné použití cookies 4.2 Specifikace Netscape Mechanismus cookies byl vytvořen společností Netscape Comunications Corporation54, tvůrcem jednoho z prvních komerčně úspěšných webových prohlížečů Netscape Navigator. Jak píše ve svém článku [18] David M. Kristol (jeden ze spoluautorů pozdějších RFC specifikací), z jeho komunikace s jedním z lidí, kteří stáli u zrodu společnosti Netscape Comunications Louem 53 V RFC 2965 jsou to Set-Cookie2, Cookie a Cookie2 54 Původně Mosaic Comunications Corporation Strana 30 Kapitola 4: Cookies Montullim (autorem první specifikace cookies a také spoluautorem dalších RFC specifikací55) vyplynulo, že ač to nebylo obecně známo, podpora cookies byla implementována již v první veřejně dostupné verzi Navigatoru ze září 1994. Údajně měla být tato vlastnost vyvinuta na přání jednoho ze zákazníků Netscape. Původní specifikace[29]56 je relativně stručná, nezachází do přílišných detailů a v některých ohledech je i nepřesná, což mj. vedlo ke snaze o pozdější standardizaci v rámci IETF. 4.2.1 K původu termínu „cookie“ V úvodu specifikace je popsán základní účel – mechanismus, kterým HTTP server může u HTTP klienta ukládat a opět od něho získávat informace napříč jednotlivými spojeními. Objekt který je tímto způsobem odesílán je zde nazýván cookie. Zde bychom rádi uvedli několik poznámek k tomuto pojmenování. Tento termín v angličtině v základním významu označuje sušenku či jiné obdobné sladké pečivo57. Specifikace doslova uvádí, že tento název byl vybrán aniž k tomu byl nějaký zvláštní důvod (for no compelling reason). Naproti tomu, jak uvádí [35] pod jedním z významů hesel cookie respektive magic cookie, jde o termín pocházející z prostředí operačních systémů UNIX, označující jakýsi objekt posílaný jedním programem druhému (zejména se může jednat o určitý typ identifikátoru). Obdobně se též o původu tohoto označení píše v [58]. To je popis, který se velmi dobře hodí také na tyto „internetové“ cookies a zřejmě odtud čerpal jejich autor (Lou Montulli) inspiraci když vybíral název. My budeme v tomto textu nadále užívat anglického termínu cookie (plurál cookies), neboť užívat termín „sušenka“ či jiné slovo obdobného významu se nám nejeví jako vhodné. 4.2.2 Hlavička Set-Cookie Každá cookie má určité vlastnosti a ty jsou definovány právě hlavičkou Set-Cookie, která se skládá z několika parametrů. Většina parametrů má název a příslušnou hodnotu, která se od parametru odděluje znakem rovnítka. Jednotlivé parametry se od sebe oddělují středníkem. Název a hodnota Základním a v této verzi jediným povinným parametrem je název a obsah informace, která má být uložena. Obojí se zapisuje jako jeden parametr ve formátu NAZEV=OBSAH. Je tak možné v rámci jednoho serveru uložit více cookies s různými názvy. Platnost Druhý parametr nese název Expires a udává, platnost cookie. Jde o to, jak dlouho má být daná informace uchovávána a odesílána zpět serveru. Cookies totiž umožňují udržení platnosti relace také po ukončení (a případném dalším nastartování) prohlížeče. V takovém případě se většinou ukládají do zvláštního souboru58, ze kterého jsou po novém spuštění prohlížeče načteny. V parametru Expires je uvedeno datum ve tvaru Wdy, DD-Mon-YYYY HH:MM:SS GMT59. To udává vypršení platnosti konkrétní dané cookie. Jestliže tento parametr uveden není, cookie je 55 Tento muž se na svém osobním webu[27] přiznává k podílu na autorství také dalších kontroverzních součástí WWW jako je HTML tag <blink> či implementace animovaných GIF obrázků do prohlížeče, ale také HTTPS či proxy. 56 Dodnes je tento dokument označen jako předběžný (preliminary) s varováním „užívat obezřetně“ 57 Není vyloučeno, že i tento fakt přispěl k tomu, že se kolem cookies šířilo tolik fám a mýtů zejména v anglicky psaném v tisku. Možná pokud by nebylo tohoto známého „kulinářského“ názvu , debata by se v takové míře nerozšířila za hranice odborných periodik. 58 tzv. cookie file V prohlížeči Netscape to byl soubor cookies.txt; Internet Explorer ukládá cookies do více souborů podle jednotlivých serverů. 59 Někdy jsou uváděny a akceptovány i mírně jiné formáty (např. s dvojciferným označením roku), ale ve specifikaci se uvádí tento. Strana 31 Kapitola 4: Cookies platná jen do okamžiku ukončení prohlížeče60 (tzv. session cookie). Někdy bývají tyto označovány termínem dočasné a ty, které přetrvávají po uzavření prohlížeče potom jako permanentní či trvalé. Toto označení však není přesné, neboť i ony jsou svým způsobem dočasné (do stanoveného času). Jde zřejmě buď o nepřesnost, nebo nevhodný překlad anglického termínu persistent. Doména Třetí parametr nese název Domain a umožňuje použití cookies na rozsáhlejších serverech velkých společností, které mají více domén nižších řádů. Pokud tento parametr není v hlavičce přítomen, cookie je odesílána pouze na ten server (s tím přesným doménovým jménem), který ji poslal. V opačném případě je odeslána na servery s takovým doménovým jménem, které končí (tail-match) hodnotou tohoto parametru61. Samozřejmě server nesmí do parametru nastavit cizí doménu. K dalšímu omezení možného příliš širokého spektra doménových jmen slouží podmínka, která stanoví minimální počet teček (čili oddělovačů doménových úrovní). To proto, aby nebylo možno nastavit parametr například na .com nebo .co.uk. Pro sedm zvláštních domén nejvyšší úrovně62 to byly dvě tečky, pro ostatní národní domény potom tři tečky63. Cesta Předposlední parametr Path je jistou obdobou předchozího, ovšem netýká se doménové hierarchie, ale adresářové struktury. Když není uveden, cookie je možné odeslat (po aplikaci pravidel týkajících se domény) pouze na stejnou adresu, ze které přišla příslušná hlavička Set-Cookie64. Jinak je odesílána se všemi HTTP požadavky, kde je parametr na začátku adresy. Zde již není výslovně uvedeno, že by bylo nutné, aby parametr odpovídal adrese dokumentu, se kterým je odesílán (jako u domény). Server tak může při požadavku na dokument z adresáře /neco vrátit cookie s parametrem Path nastaveným na hodnotu /jiny a ta projde a bude přijata. Bezpečné spojení Poslední parametr nemá žádnou hodnotu a zapisuje se tedy případně pouze jeho název. Ten zní Secure a označuje cookies, které (pokud je přítomen) smí být posílány pouze po zašifrovaném spojení. Cookies jsou totiž (jako ostatně všechny HTTP hlavičky) přenášeny po síti v otevřené textové podobě a to může být pro některá jejich potenciální využití nevhodné. Následující dva příklady ukazují nastavení cookie serverem. První z nich je minimální příklad, kdy je odeslána cookie s platností do konce relace (uzavření prohlížeče) odesílatelná pouze na stejnou adresu, odkud byla přijata (doména i adresář). V druhém případě jde naopak využito všech parametrů. Set-Cookie: jmeno=michal Set-Cookie: prijmeni=hauzirek; expires=Sun, 15-08-2004 11:23:00 GMT ; path=/; domain=.example.com; secure 60 Navigator ve verzi 1.1 a nižší údajně obsahoval chybu, kdy byly ukládány pouze cookies, které měly nastaven parametr Path (viz dále) na /. 61 Ač se dá předpokládat úmysl (zřejmý také z tam uvedených příkladů), že má jít pouze o domény nižší úrovně a ne tedy například example.com a anotherexample.com, výslovně to však uvedeno není. Navíc u parametru Path se tento princip uplatňuje a cookies s Path nastaveným na /foo mají být odesílány i do adresáře /foobar. Bylo by možné argumentovat počtem dvou nutných teček v parametru, kdy jedna z nich by byla na začátku (.example.com). Takový příklad ale ve specifikaci není. Z provedených pokusů s ranými verzemi Navigatoru však vyplývá, že akceptují i cookies které mají v Domain o jednu tečku méně než vyžaduje specifikace (tedy 1 resp. 2). 62 COM, EDU, NET, ORG, GOV, MIL a INT 63 Tato myšlenka zřejmě vychází z předpokladu, že veškeré národní domény budou obdobně členěny o úroveň níže dle charakteru. Například com.cz, edu.cz apod. 64 Není přesně specifikováno, zda má jít o kompletní adresu (tedy tentýž dokument), což by z textu spíše vyplývalo, nebo pouze tentýž adresář. Navigator od počátku aplikuje druhý přístup. Strana 32 Kapitola 4: Cookies 4.2.3 Chování klienta a hlavička Cookie Jak již bylo řečeno, klient odesílá serveru hodnoty cookies v hlavičce požadavku s názvem Cookie. Ta obsahuje pouze název a hodnotu oddělené opět rovnítkem. Je možné odeslat také více těchto dvojic najednou, v tom případě se oddělují stejně jako parametry, tedy středníkem65. Ze všech cookies, které má klient uložené před odesláním požadavku, vybere ty, které jsou stále ještě platné a odpovídají doménou, adresou a případně parametrem Secure a ty následně odešle. Podle specifikace by klient měl být schopen uložit celkem alespoň tři sta cookies. Limit pro jeden server (či doménové jméno) je dvacet. Přitom je počítáno, že jedna cookie by neměla mít velikost přesahující čtyři kilobyty. Cookies se stejnými názvy se při přijetí přepisují pouze za předpokladu, že mají také stejnou doménu a cestu (path). Jinak zůstávají jako dvě různé cookies vedle sebe. Protože tak pro jeden server může být uloženo více cookies se stejnými názvy, měl by je klient posílat seřazené podle konkrétnosti parametru Path (konkrétnější dříve). Za předpokladu, že klient obdržel obě cookies z předzházejícího příkladu ze a adresy jiné, než pouze /, obsahoval by další požadavek následující hlavičku. stejné domény Cookie: jmeno=michal; prijmeni=hauzirek 4.3 RFC 2109 Předchozí subkapitola popisovala první specifikaci cookies, která byla svým způsobem proprietární a v některých ohledech poměrně nepřesná. Skutečný formální standard to nebyl a proto bylo nutné jej vytvořit. Prvním z nich byl v únoru 1997 dokument RFC 2109. Zde si popíšeme nejen rozdíly oproti specifikaci Netscape, ale také některé okolnosti jeho vzniku. 4.3.1 Okolnosti vzniku Jak píše David M. Kristol[18], kolem roku 1995 bylo kromě mnoha dalších témat (popsání HTTP 1.0 či řešení jeho zásadních problémů zmiňovaných v úvodu subkapitoly 1.4) bylo mezi zainteresovanými diskutovaným tématem také rozšíření HTTP o určitou podporu udržování stavových informací. Původně se přemýšlelo o tom, že by byla začleněna přímo do další verze protokolu HTTP. V průběhu diskusí o ní byla ale tato snaha vyčleněna do samostatné podskupiny (jejímiž členy byli jak Kristol, tak i již zmiňovaný Montulli). Původně bylo plánováno, že až bude tato problematika samostatně vyřešena, bude opět zařazena zpět a objeví se jako součást protokolu HTTP. V této skupině se od původních návrhů66 postupně dospělo k názoru, že nový mechanismus by neměl být konkurentem výše zmiňovaných cookies od Netscape a měl by s nimi být kompatibilní. Nakonec bylo rozhodnuto vycházet přímo z této původní specifikace ovšem s tím, že musela být v mnoha ohledech precizována a upřesněna (v souladu s požadavky na standardy). 65 Již v HTTP 1.0 se uvádí, že v jednom požadavku či odpovědi je možné uvést více hlaviček stejného jména, pokud je možno jejich hodnoty beze změny významu zkombinovat dohromady oddělené čárkou. Z tohoto pohledu by se tedy jevilo lepší užít jako oddělovače čárku. 66 Jedním z nich byly například jakési jednorázové identifikátory, které by byly platné pro jedno spuštění prohlížeče a odesílány spolu s požadavky. Strana 33 Kapitola 4: Cookies 4.3.2 Nedostatky specifikace Netscape Originální specifikace trpěla některými zásadními nedostatky. Bylo nutno například doplnit přesnou syntaxi hlaviček Set-Cookie a Cookie včetně toho, zda u parametrů záleží na velikosti písmen. Protože hlavičky se stejným názvem je v HTTP možné spojovat pomocí čárky, mohlo být datum v parametru Expires které čárku obsahuje nesprávně interpretováno. Řešením by byla možnost uvádění hodnot v uvozovkách, ani to však původně nebylo zavedeno. Algoritmus pro ověřování domén (dvě resp. tři tečky) nebyl vyhovující a zcela jasná nebyla výchozí hodnota parametru Path, pokud není explicitně uveden. Problematické také bylo to, že server na jedné doméně mohl obdržet zpět cookies pocházející z jiného serveru na jiné doméně (pokud se oba nacházely ve stejné doméně vyšší úrovně). Pokud měly tyto cookies stejná jména, nemohl server poznat, která z nich je „ta jeho“. Za určitých okolností tak útočník mohl zmást server a podstrčit mu neočekávaná data. (Cookie Spoofing). Tuto situaci znázorňuje následující příklad s malými změnami převzatý z [40]. 1. Klient odešle požadavek na server victim.cracker.edu a obdrží cookie session_id=1234 pro niž nastaví výchozí doménu victim.cracker.edu. 2. Tentýž klient odešle požadavek na server spoof.cracker.edu a obdrží cookie session_id=1111 s doménou explicitně nastavenou na .cracker.edu. 3. Týž klient opět odešle požadavek na victim.cracker.edu a spolu s ním odešle Cookie: session_id=1111; session_id=1234 Server tak obdrží dva různé identifikátory a nemá možnost poznat, který z nich je „ten pravý“. Jak se zachová, tedy zda zpracuje první, druhý, případně vypíše chybu závisí na konkrétní aplikaci. K dalším diskutovaným tématům patřila otázka, jak pracovat s cookies, které přicházejí z různých portů tj. brát různé porty téhož serveru tak, že představují stejnou společnou doménu, nebo ne. Tato otázka ale ještě v této specifikaci vyřešena nebyla. 4.3.3 Neověřitelné transakce a cookies třetích stran Z pozdějšího pohledu se ale jako mnohem zásadnější ukázala diskuse o takzvaných neověřitelných (unverifiable) transakcích později v této souvislosti spíše známých jako cookies třetích stran (thirdparty). K méně technické stránce problémů, které jsou s nimi spojeny se detailně vrátíme v subkapitole 4.5.1. Prozatím alespoň poznamenejme, že jejich použitím v rozporu s původním účelem tohoto mechanismu, je za určitých podmínek možné sledovat, po kterých serverech se uživatel při používání služby WWW pohybuje. Problém spočívá v tom, že prohlížeč služby WWW poměrně často zasílá HTTP požadavky i na jiné servery, než si je uživatel přímo vědom. Děje se tak zejména pokud získává dokumenty, které jsou nějakým způsobem vloženy do uživatelem požadovaných dokumentů. To se týká (jak již bylo zmiňováno v subkapitole 1.4 v souvislosti s nutností znovuotevírání přenosového kanálu) zejména obrázků či skriptů. Ty nemusejí pocházet ze stejného serveru jako původně požadovaný dokument a prohlížeč se tak připojuje i k jiným serverům, než které uživatel „objektivně navštívil. Jestliže cookie (resp. hlavičku Set-Cookie) je možné poslat s jakoukoli HTTP odpovědí obsahující libovolný dokument, je možné, že ji prohlížeč obdrží také při podobném požadavku. Pokud bude ze stejného serveru někdy v budoucnu získávat další dokument (například opět jako kamsi vložený obrázek), odešle spolu s požadavkem na tento „cizí“ server také hodnotu cookie. Takovéto objekty ukazující na tentýž server (nebo jejich skupinu dle nastavení parametru Domain) Strana 34 Kapitola 4: Cookies mohou být vloženy v dokumentech na mnoha jiných serverech (což je například běžné u poskytovatelů reklamních služeb, či služeb pro měření počtu přístupů). Po dobu platnosti dané cookie tak dotyčný server může (například z hlavičky Referer, která je při této příležitosti také odesílána, ale i jinak) sledovat, z kterého serveru byl klient k požadavku nasměrován. Jestliže mají cookie odesílané na tento server dlouhou dobu platnosti a obsahují jedinečný identifikátor (jak tomu zpravidla bývá), lze také k uživateli (prostřednictvím tohoto identifikátoru) přiřazovat servery, které navštívil a tvořit tak jeho profil. Proto byl do nové specifikace zaveden termín neověřitelné transakce. To jsou takové požadavky, u kterých si uživatel nemůže předem ověřit jejich URI. Klasicky jde o požadavky na vložené objekty, ale také například automatická přesměrování stavovými kódy67. Celý proces schematicky znázorňuje obrázek 10, kde klient postupně navštíví dva HTTP servery (example.net a another.com), ze kterých získá různé HTML dokumenty ovšem z obou s vloženým obrázkem ze serveru ad.com. V odpovědi na první požadavek je z něho klientovi odeslána identifikační cookie, kterou ten odesílá v následujících požadavcích. Na serveru ad.com je pro klienta na základě identifikátoru vytvářen profil dle navštívených serverů. Zmiňované neověřitelné transakce (požadavky) jsou znázorněny čárkovaně. Obrázek 10: Neověřitelné transakce a užití cookies třetích stran k profilování 4.3.4 Hlavní změny v RFC 2109 Podpora stavových informací nebyla nakonec implementována přímo do protokolu HTTP, ale byla vydána jako samostatný standard až v únoru 1997 (na rozdíl od lednového RFC 2068 – HTTP 1.1) jako dokument RFC 2109[40]. Ten obsahuje mimo jiné precizně popsaná pravidla pro syntaxi hlaviček (např. hodnoty parametrů mohou být uzavírány do uvozovek) a také několik podstatných změn a vylepšení ve funkčnosti oproti specifikaci Netscape. Kvůli kompatibilitě s původní verzí byl do hlavičky Set-Cookie přidán nový povinný parametr Version=1 označující cookie podle RFC 2109. Cookies které ho neobsahují, jsou pokládány za původní cookies dle Netscape. Dále bylo stanoveno, že prvním parametrem musí být název a hodnota68 a na dalším pořadí parametrů nezáleží. Problematické Expires s čárkou, která mohla způsobovat potíže, bylo nahrazeno parametrem s názvem Max-Age, jehož hodnotou byl počet sekund, po který má být daná cookie platná. Přibyl ještě jeden nový parametr a sice Comment, který umožňuje uživatele například informovat o účelu ke kterému je cookie zasílána. 67 V to nejsou zřejmě počítána kliknutí na odkaz (většinou prohlížeč zobrazí cílové URI) či odeslání formuláře. 68 To bude důležité v souvislosti s nekompatibilitou Internet Exploreru o které se zmíníme dále. Strana 35 Kapitola 4: Cookies Upřesněno bylo, že výchozí hodnotu atributu Path, pokud není uveden, tvoří nikoli celá cesta k požadovanému souboru, ale pouze její adresářová část (po poslední znak / ovšem bez něho). Je-li uveden, musí již jeho hodnotou začínat také cesta k požadovanému dokumentu. Změn se dočkalo také zacházení s doménovými jmény. Pokud je v této verzi cookies explicitně uveden parametr Domain, musí začínat tečkou. Jinak je doplněno jméno serveru bez tečky na začátku. Pro porovnávání doménových jmen byla zavedena nekomutativní operace „domainmatch“. Pomocí té se určuje, zda má být na server s daným doménovým jménem odeslána ta která cookie. V podstatě jde opět buď o tutéž doménu nebo domény nižších úrovní. Jisté omezení je však v tom, co je možné zapsat do parametru Domain. Předešlý „tečkový“ algoritmus byl nahrazen sofistikovanějším a také více omezujícím. Cookie má být odmítnuta mimo jiné, pokud je v parametru Domain uvedeno doménové jméno výše než o jednu úroveň nad jménem serveru. Kvůli hodnotám jako .com musí také obsahovat alespoň jednu tečku uvnitř. Podstatnou změnou prošla také hlavička Cookie, kterou klient vrací hodnoty. Povinně je teď uvozena znaky $Version=1; označujícími použitou verzi. Následuje tradiční seznam párů název-hodnota, ovšem s dalšími proměnným. Pokud totiž byla cookie přijata s explicitně nastavenými parametry Path či Domain, jsou tyto serveru odeslány také zpět. Předchází se tak podstrčení cookies (cookie-spoofing) naznačenému v příkladu na straně 34. Jeho třetí řádek by nyní vypadal následovně. 3. Týž klient opět odešle požadavek na victim.cracker.edu a spolu s ním odešle Cookie: $Version=1; session_id=1111; $Domain=.cracker.edu; session_id=1234; Server tak nyní může poznat, která z hodnot byla nastavena cizím serverem. Jak je vidět, pro pomocné údaje se užívají názvy začínající znakem $. Ty jsou vyhrazené a nemají být používány pro názvy vlastních proměnných užívaných v aplikacích. Servery, které podporují pouze Netscape cookies s nimi, díky jejich způsobu zápisu, budou zacházet jako s běžnými cookies a nehrozí tak tedy z této strany nekompatibilita. Velmi významný byl také požadavek na prohlížeče, že v případě neověřitelných transakcí, nesmí odesílat žádné cookies na cizí servery69, respektive mohou tak činit pokud to uživatel povolí. Jako výchozí stav ale musí mít prohlížeč nastaveno v takových případech neodesílat. Následují příklady stejných cookies jako v předchozí subkapitole. Set-Cookie: jmeno=michal; Version=1 Set-Cookie: prijmeni=hauzirek; Max-Age=864000; path=/; Version=1; domain=.example.com; secure; comment=testovaci Cookie: $Version=1; jmeno=michal; prijmeni=hauzirek; $Domain=.example.com; $Path=/ 4.4 RCF 2965 a 2964 Po vydání RFC 2109 se rozběhla obsáhlá a vášnivá diskuse zejména ze strany internetových reklamních společností, které protestovaly proti zakázání cookies třetích stran či přesněji jejich deaktivování v základním nastavení. Tomuto tématu je věnována subkapitola 4.5.1. Objevily se ale také další – techničtější problémy. 69 Přesně tu je napsáno, že je smí odeslat pouze, pokud je odeslal či obdržel také při té transakci, které vedla k vyvolání neověřitelné transakci (tedy při získání hlavního dokumentu). Toto omezení je až nečekaně přísné a autoři jej také v další verzi upravili tak, že není nutné, aby v původní transakci došlo k odeslání, či příjmu cookie. Omezení je tam řešeno přes doménová jména. Strana 36 Kapitola 4: Cookies 4.4.1 Nekompatibilita Internet Exploreru Po schválení (ale ještě před definitivním vyhlášením) RFC 2109 byla objevena nečekaná a poměrně závažná nekompatibilita v tom, jak s novým formátem hlaviček zacházel Microsoft Internet Explorer ve verzi 370. Tržní podíl tohoto prohlížeče byl v té době podíl zastoupení třiceti procent a stále rostl. Hlavní problém spočíval ve faktu, že zatímco Netscape jako název cookie chápal v pořadí první neznámý parametr, Internet Explorer takto zacházel s neznámým parametrem posledním. Pokud se jednalo o hlavičku podle původní specifikace, výsledné chování bylo stejné. Jestliže však přijal hlavičku novou s novými parametry Max-Age či Version, místo požadovaného názvu a hodnoty cookie byly uloženy právě tyto parametry. Příčinou byla mimo jiné nedokonalá specifikace Netscape cookies, kdy nebylo výslovně specifikováno, kolikátý parametr v pořadí obsahuje název a hodnotu a jak přesně má prohlížeč zacházet s neznámými parametry. Jako možná řešení tohoto problému se objevovaly zejména dva návrhy. Prvním z nich bylo zavedení jiné hlavičky pro „nové“ cookies, než té, která byla použita u Netscape. To by s sebou přineslo sice úplnou nekompatibilitu (ne zcela pokud by byly odesílány vedle sebe obě hlavičky) se starými prohlížeči, ale bylo by možné oprostit se od problémů s ní spojených. Hrozil však začarovaný kruh, kdy by kvůli v té době již poměrně velkému rozšíření „starých“ cookies na mnoha serverech musela být tato varianta stále ještě podporována i v novějších prohlížečích. Z toho důvodu by pak provozovatelé serverů neměli závažnější důvod přejít na novou specifikaci (což by s sebou přineslo náklady). Po podpoře nového mechanismu v prohlížečích (opět náklady tentokrát pro vývojáře) by tedy také nebyla poptávka71. Druhý, velmi vtipný, návrh vycházel přímo z popsané situace a myšlenky asi ve smyslu: „Pokud jeden prohlížeč potřebuje název a hodnotu na začátku a druhý na konci, proč ho nedat na oba konce?“ Dvojice název-hodnota by tak byla klasicky na začátku hlavičky a zopakovala by se ještě jednou na jejím konci. Tato myšlenka byla jednoduchá a zdála se funkční. Zvedly se však některé hlasy proti tvrdící, že je to nesystémové řešení, které vede téměř ke zdvojnásobení délky přenášených dat. Navíc se ukázalo, že ji nebylo možné uplatnit v Internet Exploreru verze 272 a tak byla definitivně opuštěna. 4.4.2 Další diskutovaná témata V diskusích se objevovaly také další návrhy na novou specifikaci cookies. Protesty reklamních společností proti zákazu cookies třetích stran a na druhé straně různých ochránců práv (viz subkapitolu 4.5.1) vedly k úvahám o jakémsi druhu „certifikovaných cookies“, které by byly digitálně podepsány důvěryhodnou autoritou, která by garantovala, že data takto získaná nebudou zneužita. Tyto práce ale nebyly dotaženy do konce a zmiňované myšlenky se tak staly pouze inspirací pro některé další protokoly sloužící k ochraně soukromí uživatelů (viz dále). Opět se otevřela diskuse nad tím, pro které porty má být cookie platná a na jaký rozsah serverů má být zasílána. Také se objevily požadavky na poskytnutí detailnější informace uživateli. Tyto a některé další připomínky se odrazily v konečném znění specifikace, která byla jako RFC 2965[46] vydána až v říjnu 2000 (!). Zároveň s ní byl také vydán dokument RFC 2964[45], který popisoval 70 Mně se níže popsané chování při testech podařilo docílit pouze u testované verze 2.0. Dostupná verze 3.0.1152 zacházela s hlavičkami správně. 71 K této situaci nakonec také došlo a cookies dle RFC 2965 nejsou podporovány ani v nejnovějších verzích dnes dominantního Internet Exploreru, ani Mozilly. Svůj podíl na tom měla jistě také neúměrně dlouhá doba předcházející vydání finální podoby dokumentu. 72 Tento přístup na mnou testované verzi MSIE 2.0 fungoval. Strana 37 Kapitola 4: Cookies některé doporučené a naopak nedoporučené způsoby použití cookies také s ohledem na ochranu soukromí. 4.4.3 Změny v RFC 2965 Jak již bylo naznačeno, původní hlavička Set-Cookie byla nahrazena a sice hlavičkou s názvem Set-Cookie2. Její formát zůstal stejný jako v RFC 2109, ale přibylo několik nových parametrů. Kromě existujícího parametru Comment byl zaveden parametr CommentURL, který může obsahovat URI dokumentu, kde je detailně (a například pomocí vyjednávání o obsahu i v jazyce uživatele) popsán účel, k němuž jsou cookies používány. Další nový parametr je Port. Ten může být uveden buď samostatně bez hodnoty, v takovém případě je cookie klientem odesílána pouze na port, ze kterého přišla. Může také obsahovat hodnotu, kterou tvoří seznam portů a v takovém případě je odesílána pouze na tyto porty. Pokud parametr Port přítomný není, lze cookie odeslat na libovolný port. Poslední nový parametr také nemá hodnotu a nese jméno Discard. Jestliže je přítomen, je cookie vždy smazána po ukončení prohlížeče i když její platnost dle parametru Max-Age ještě nevypršela. Je tedy smazána buď po vypršení platnosti, nebo po zavření prohlížeče podle toho, co nastane dříve. Dalších parametrů se týkají některé dílčí změny. Výchozí hodnotou pro Path je nyní opět cesta k adresáři požadovaného dokumentu, ale včetně koncového lomítka. Doména již nemusí povinně začínat tečkou. Pokud je explicitně nastavena a tečkou nezačíná, prohlížeč tečku doplní. S parametrem Domain souvisí i další změna – pro podporu sdílení cookies v intranetovém prostředí je vyhrazena speciální doména nejvyšší úrovně .local. Jako označení verze zůstává číslo jedna, některé další formulace byly zpřesněny. Přibylo zakomponování nového parametru Port do pravidel pro odmítání cookies (pokud cookie přijde z jiného portu, než který je tam explicitně uveden, je odmítnuta). Také bylo napraveno příliš přísné pravidlo pro příjem cookies pomocí neověřitelných transakcí. Nicméně stále platí, že z cizích serverů nesmí být při výchozím nastavení prohlížeče přijímány. Hlavička, kterou jsou cookies odesílány serveru zůstala stejná tj. Cookie. Ke speciálním parametrům přibyl v celku očekávaně $Port. Definována byla také nová hlavička Cookie2, kterou má klient odeslat v případě, že obdrží starou hlavičku Set-Cookie, aby tím dal serveru najevo, že umí pracovat s vyšší verzí. 4.4.4 Velké zpoždění a neúspěch RFC2965 Práce na nové specifikaci začaly prakticky ihned po vydání té předchozí (tedy na počátku roku 1997). Přestože nový dokument RFC 2965, který novou specifikaci obsahuje není až tolik odlišný od toho předchozího, trvalo jeho vydání z mnoha důvodů (viz [18]) tři a půl roku. Během této doby se nejen vyměnila podstatná část vedení IETF, ale zejména se internet ještě dále rozrostl a rozvinul. Obrovský nárůst uživatelů mezi léty 1997 a 2000 s sebou nesl také rychlý rozvoj služeb. Jedním ze způsobů, jak na internetu vydělávat, se stala reklama vkládaná do internetových stránek. Z níže popsaných důvodů byla často spojena právě s využitím cookies třetích stran. Mezitím se také Internet Explorer stal z velké části dominujícím prohlížečem a ustalo velmi rychlé vydávání nových verzí prohlížečů, běžné dříve právě z důvodu silné konkurence. Ač se již v prvním RFC říkalo, že podpora pro cookies třetích stran má být v základním nastavení zakázána, žádný z hlavních producentů prohlížečů (míněno Microsoft a Netscape) tak neučinil. Spíše než na stranu uživatelů, kteří již od jisté doby za prohlížeč nemuseli platit, postavily se tyto Strana 38 Kapitola 4: Cookies firmy za zájmy reklamních společností a provozovatelů serverů vůbec. Kromě prohlížečů (v té době již zdarma) totiž dodávaly také serverová řešení (ta samozřejmě zdarma nebyla). Zákazníky z řad těch platících si samozřejmě předcházely více. Tyto faktory mimo jiné přispěly k tomu, že standard RFC 2965 nebyl dodnes implementován do žádného z vedoucích prohlížečů73. Ačkoli některé ostatní minoritní prohlížeče jej implementují velmi přesně74, tato skutečnost prakticky brání většímu rozšíření cookies dle RFC 2965 na serverech. Opět následují příklady hlaviček. Set-Cookie2: jmeno=michal; Version=1 Set-Cookie2: prijmeni=hauzirek; Max-Age=864000; path=/; domain=.example.com; secure; comment=testovaci; Version=1; commentURL="http://www.example.com"; discard; port="80,81,8080" Cookie2: $Version=1 Cookie: $Version=1; jmeno=michal; prijmeni=hauzirek; $Domain=.example.com; $Path=/; $Port="80,81,8080" 4.5 Cookies a ochrana soukromí Jak bylo již na několika místech zmíněno, s cookies jsou spojeny otázky týkající se ochrany soukromí a anonymity na internetu. Tento mechanismus se za poměrně krátkou dobu své existence stal velice diskutovaným tématem a to nejen mezi odbornou veřejností, ale také v obecném tisku a dokonce v mezinárodní politice. Zejména různá neodborná vyjádření tak přispěla k šíření silně zkreslených informací, které byly silně zavádějící. Také proto se nyní není možné při návrhu aplikací zcela spoléhat právě na tento mechanismus přenosu informací a je nutné počítat s možností, že jeho podpora bude v prohlížeči uživatele deaktivována. Mnohem větší vinu na tom ale nese samozřejmě jeho zneužívání k jiným účelům, než pro které byl původně určen. To totiž přišlo jako první a posloužilo jako impuls k dalším akcím. 4.5.1 Cookies třetích stran a reklama Výše jsme v souvislosti s neověřitelnými transakcemi hovořili o tom, že cookies třetích stran s dostatečně dlouhou dobou platnosti mohou být užívány pro sledování uživatelova pohybu po webových serverech. Oproti jiným možným způsobům této činnosti mají cookies dvě nesporné výhody. Je totiž možné je udržovat dlouhou dobu i po zavření prohlížeče a navíc pro běžného uživatele nejsou vidět. Nyní se dostáváme k tomu, proč vůbec je takováto činnost někým provozována. Nejčastěji jde o takzvané profilování uživatelů – tedy snahu vytvořit pro jednotlivé uživatele individuální profily tak, aby byly zjištěny jejich záliby a zájmy. Tyto (stále anonymní) profily jsou potom užívány pro přesnější zacílení reklamy. Zacílená reklama je vždy úspěšnější (a přináší tedy vyšší zisky) než prostá celoplošná, kdy jsou potenciální zákazníci oslovováni náhodně či hromadně. Oproti hromadné reklamě jsou rovněž náklady na jednoho získaného zákazníka mnohem nižší. V internetovém prostředí, kdy jsou reklamní společnosti často placeny v případě klasických reklamních bannerů nejen za pouhé zobrazení, ale zejména za kliknutí na reklamu uživatelem, je také v jejich zájmu, aby co nejvíce reklamy bylo správně zacíleno. 73 Pro přesnost, z předchozího RFC 2109 se implementace dočkal pouze parametr Max-Age v Mozille (viz testy dále). 74 Z dále testovaných to je téměř vzorovou implementací Lynx a s jistými výhradami též Konqueror a Opera. Strana 39 Kapitola 4: Cookies Když uživatel odešle na reklamní server svůj požadavek (nejčastěji právě jako neověřitelnou transakci) spolu s příslušnou cookie, která jej identifikuje, je na základě tohoto identifikátoru a doposud zjištěných oblastí zájmu vybrána příslušná reklama, která by jej mohla zaujmout75. Profily jsou také obohacovány informacemi o tom, na které reklamy uživatel skutečně klikl, které pomáhají dalšímu zpřesňování. Profilování zákazníků jako takové je s nástupem výkonných informačních technologií do obchodu obecně poměrně rozšířené76 a provádí jej řada větších podniků. Zásadní rozdíl tu však je ten, že se většinou jedná o jejich zákazníky, kteří se jimi stali z vlastní vůle. Taková situace nastává například pokud zákazník v supermarketu užívá věrnostní kartu (která slouží jako jeho identifikátor). Ačkoli je možné, že o tom neví, umožňuje tak supermarketu zjišťovat, jaké zboží kdy nakupuje, případně jak reaguje na nabízené slevy apod. K tomu ale při vystavení této karty dal svůj souhlas. Něco jiného je, když jsou pro tvorbu profilů používány cookies. Ty jsou pro většinu běžných uživatelů skryté a navíc užívání služby WWW je obecně spojeno s jakýmsi pocitem anonymity. Vehementní protesty reklamních společností proti ustanovením v RFC 2109, která se týkala výchozího nastavení prohlížečů byly vyvolány zejména obrovským podílem nezkušených uživatelů pohybujících se internetu. Takoví totiž nejen nevědí, co to cookies jsou, ale také jen velmi zřídka mění výchozí nastavení svého prohlížeče. Toto opatření by se tak téměř rovnalo úplnému zákazu cookies třetích stran (neboť zkušenější uživatelé by rozhodně neměli důvod jej povolovat). Odtud tedy vychází základní zdroj protestů ochránců soukromí. Hlasy proti tomuto způsobu užívání cookies se začaly objevovat zejména v době po zveřejnění RFC 2109, ale již i předtím [7]. Vzniklo několik serverů věnujících se výlučně této problematice (např. [10], [11] či [60]). Pro přesnost jen doplňme, že profilování je možné nejen používáním cookies třetích stran, ale také za pomoci klasických cookies. V tomto případě ale není informace o uživateli zdaleka tak přesná, neboť pochází pouze z jeho chování na jediném serveru77. DoubleClick a Abacus-Direct Další mediální pozdvižení způsobila zejména aféra okolo největší americké webové reklamní společnosti DoubleClick. Ta totiž v roce 1999 ohlásila spojení se společností Abacus[19], která vlastnila velkou databázi obyvatel obsahující jména i adresy. Objevilo se tak podezření, že obě společnosti chtějí své databáze (webových profilů a adres) spojit[20] a získat tak velkou databázi konkrétních lidí a jejich zájmů. Jako možné klíče ke spojení měly být použity například jména a adresy, které uživatelé zadali na webových stránkách některých zákazníků DoubleClick (těch, kterým poskytoval reklamu) třeba v rámci internetových obchodů. Proti tomu okamžitě začali protestovat ochránci práv a se společností DoubleClick bylo zahájeno vyšetřována americkou Federal Trade Commission. Evropská komise Cookies však nebyly horkým tématem pouze ve Spojených státech, ale také v Evropě. Na půdě Evropské Komise byly v rámci ochrany soukromí občanů členských zemí mimo jiné také hojně diskutovány. O nepříliš dobrém pochopení jejich původního významu svědčí také to, že původně 75 V primitivnějších verzích jsou identifikátory užívány pouze k zamezení opakovanému zobrazení stejné reklamy. 76 Viz celá široká oblast ICT nazývaná CRM – Customer Relationship Management. 77 Ani tak to ale v některých případech nemusí být zbytečné. Běžně je takto zjišťován obvyklý pohyb uživatele po webu a jeho případné další návraty z důvodů vylepšení navigace či hodnocení úspěšnosti reklamy. Na některých typech serverů (zejména portálového typu) je klasické profilování také možné, neboť je zde zastoupeno relativně široké spektrum zájmů. Navíc je možné do něho zahrnout také termíny zadané do vyhledávačů. Bez zajímavosti v této souvislosti není, že v současnosti vyhledávací server Google posílá identifikační cookies s dobou platnosti do roku 2036. Strana 40 Kapitola 4: Cookies s nimi mělo být zacházeno jako s nevyžádanou reklamní poštou – tedy bez výslovného souhlasu adresáta (v tomto případě uživatele prohlížeče) neměly být povoleny. Nakonec (velmi se o to zasloužila lobby právě on-line reklamních společností) je vyžadováno pouze důsledné informování uživatele. P3P v MSIE 6 Všechny tyto okolnosti vedly postupně k tomu, že v prohlížečích začala přibývat nastavení, která umožňovala uživateli bránit se takovým cookies. Stále však zůstávala ve výchozím nastavení zpravidla deaktivovaná. Jistý zlom v tom přinesl až Internet Explorer ve verzi 6, který implementoval standard P3P a ve výchozím nastavení odmítal cookies třetích stran, které neměly definovány příslušné politiky. 4.5.2 P3P První zásadní průlom do výchozího zacházení s cookies přinesl v roce 2001 Internet Explorer ve verzi 6.0. Ten měl totiž zcela nově implementovánu podporu standardu P3P78. P3P[57] (The Platform for Privacy Preferences79) se zdaleka netýká pouze cookies, ale jde o iniciativu, která se zabývá ochranou soukromí v rámci služby WWW jako celkem. Jde o jednu z reakcí na zmiňované problémy s ochranou soukromí, které celé internetové prostředí v očích široké veřejnosti diskreditovaly. Krátce k P3P obecně Standard P3P byl vyvíjen poměrně dlouho a spolupracovalo na něm mnoho lidí z různých oborů. Představuje jakýsi kompromis mezi obavou o soukromí uživatelů a obchodními zájmy reklamních a dalších společností. Stručně řečeno definuje pravidla, kterými je možno ve strojově čitelné podobě popsat politiku zacházení s osobními údaji návštěvníků webových serverů. K jejím základním částem patří údaje o totožnosti provozovatele serveru a případný kontakt na něho. Dále je uváděno spektrum informací, které jsou získávány (v různých třídách – anonymní statistiky, skutečně osobní informace apod.) a zásady práce s nimi (jak jsou získávány – s výslovným souhlasem nebo bez, jak dlouho jsou uchovávány, k jakým účelům, komu mohou být dále poskytnuty). Patří sem také údaje o tom, zda má subjekt informací možnost zjistit, jaké informace jsou o něm uchovávány a případně požadovat jejich vymazání. Znalý návštěvník s příslušným softwarem se tak může rozhodnout, zda daný server navštíví a případně, jaké osobní informace mu poskytne a to bez zdlouhavého pročítání složitých bezpečnostních politik. Samozřejmě nelze tímto způsobem zaručit, že takto popsaná politika bude také dodržena. Politiky jsou zapisovány jako XML soubory s přesně definovanou strukturou. Je rovněž možné je ve zjednodušené verzi zasílat v HTTP hlavičce s názvem P3P. Oproti původnímu plánu standard neobsahuje kontroverzní mechanismus pro automatický přenos osobních informací na server. To byl totiž také jeden z návrhů v souvislosti s profilováním uživatelů – namísto aby společnosti zjišťovaly záliby uživatelů, ti si měli z údajů, které o sobě chtěli zveřejnit, sestavit vlastní profil a ten jim potom poskytovat (viz Open Profiling Standard[30]). Blíže k celému standardu P3P viz velice obsáhlou specifikaci [57] a přidružené dokumenty [55], [56], či v českém jazyce například články [48], [50]. 78 Paradoxně to ale nemohla být jeho finální verze, neboť ta nese datum až z dubna 2002. 79 Tomu by spíše odpovídalo označení P3, která také iniciativa původně skutečně nesla. Kvůli sporům o ochranou známku ovšem bylo do označení přidáno ještě jedno 'P' – označující Project[56]. Strana 41 Kapitola 4: Cookies Implementace P3P v MSIE 6 Internet Explorer ve verzi 6 má pro práci s cookies jako výchozí (a tedy většinou uživatelů používanou) úroveň zabezpečení nazývanou Medium. Nejdůležitější pravidlo je, že jsou blokovány cookies třetích stran, které nemají nastavenu P3P politiku. Dále jsou blokovány cookies třetích stran z těch serverů, které mají v P3P politice uvedeno, že jsou jimi sbírány osobní údaje konkrétně identifikující osobu bez jejího výslovného souhlasu. Zásadní zlom tu nastává právě kvůli prvnímu pravidlu. To, vezmeme-li v potaz rozšíření Internet Exploreru, nutí servery, které využívají pro svou činnost cookies třetích stran, aby alespoň definovali vyhovující P3P politiku. To, že ji budou dodržovat a pouze do ní nenaskládají takové značky, aby jejich cookies Internet Explorer propustil, ovšem zaručit nelze. Pouhou implementací standardu P3P do prohlížečů se samozřejmě všeobecnému zneužívání cookies nezabrání. Lze tak možná pouze mírně zvýšit informovanost uživatelů, ovšem v současném stavu opět pouze těch základních principů P3P znalých. Z dalších prohlížečů, které v sobě mají v aktuálních verzích zabudovánu podporu P3P je možno jmenovat například Mozillu, ač tam není zacházení s cookies dle těchto politik jako výchozí nastaveno80. Jakýmsi přídavným modulem do Internet Exploreru, který překládá P3P politiky do srozumitelné angličtiny je PrivacyBird od AT&T[3]. 4.5.3 Mýty okolo cookies Časté (a ne vždy zcela přesné) zmínky o cookies v médiích (viz např. [4]) přispěly k rozšíření mnoha mýtů. Dílem to bylo vinou nepochopení jejich principu a dílem uváděním nepřesných a zkreslujících formulací v médiích. Některé z těch nejčastějších zde na závěr subkapitoly pro zajímavost zmíníme. První mýtus pramení ze situace, kdy někteří uživatelé prozkoumali soubor, do kterého jsou cookies ukládány a zjistili, že obsahuje i záznamy ze serverů, které nikdy vědomě nenavštívili. Šlo právě o cookies získané při neověřitelných transakcích. Tito uživatelé však pojali podezření, že je tam příslušný server uložil bez jejich vědomí a tedy tak, že se do jejich počítače nějakým způsobem „naboural“. Další z dezinterpretací souvisí pravděpodobně s tím, že cookies s dobou platnosti se ukládají na disk. Představa, že někdo může na jejich počítač automaticky a bez jejich vědomí uložit nějaká data, vedla k obavám ze šíření virů tímto způsobem. Týž fakt vedl také k obavě ze zaplnění disku příliš mnoha cookies. Také v českém tisku byl namátkou nepříliš dávno (a to v listu, který bývá považován za poměrně seriozní) uveřejněn článek[26], kde se mimo jiné píše: „(…) různé programy označované jako cookies, které bez vědomí majitele zasílají informace o jeho počítači nebo o jeho činnosti na internetu (…)“. V tomto vyznění je mechanismus pro udržování stavových informací stavěn do světla, jako by byl určen pouze ke špehování a neměl větší význam než viry. Není se co divit, že čtenář-laik po přečtení této formulace vůči této technologii ztratí veškerou důvěru. Všechna tato shora uvedená tvrzení jsou samozřejmě nesmyslná, ale pouze ukazují, jak může neodborná, nepřesná nebo nesprávně interpretovaná informace získat zcela jiný význam a jaké informační šumy mohou vznikat mezi laickou veřejností, pokud se jedná o technologii, kterou není snadné v novinářské zkratce vysvětlit. 80 Uživatelé tohoto prohlížeče ale jistě nepatří mezi ty, kteří by neuměli změnit jeho výchozí nastavení. Strana 42 Kapitola 4: Cookies 4.6 Test podpory v prohlížečích Komplikace s přijímáním standardů pro cookies a některé nejasnosti v jednotlivých specifikacích mne vedly k myšlence prověřit jejich fungování v různých prohlížečích. K dispozici jsem měl jednak nové (stav k 15.8.2004) verze tří základních na platformě Windows. Dále jsem zvolil další dva zástupce platformy Linux. Díky serverům, které uchovávají starší verze prohlížečů ([12] a [28]) jsem mohl otestovat fungování cookies i v některých z nich. Bohužel Internet Explorer je jak známo od verze 4 velmi silně integrován do operačního systému a proto jsem zástupce verzí 4 a 5 otestovat nemohl81. 4.6.1 Testované prohlížeče Do první skupiny tak patřil Microsoft Internet Explorer 6 se všemi k danému datu dostupnými82 opravami včetně ServicePacku 2 pro Windows XP. Na stejném operačním systému byly dalšími účastníky testu Mozilla verze 1.8a2 a Opera ve verzi 7.54. Je zajímavé, že se i v těchto moderních prohlížečích objevily v testované oblasti některé zásadní chyby a nedostatky. Linux zastupoval jednak Konqueror – součást prostředí KDE 3.2 a dále textový Lynx verze 2.85r1. Obojí provozované na Mandrake Linuxu 10. Ze starších verzí prohlížečů jsem zvolil pouze různé verze někdejších dvou velkých rivalů – Internet Exploreru a Navigatoru. U Navigatoru šlo postupně o verze 2.0283 (1995), 3.04 (1996) a 4.03 (1997). Internet Explorer zastupovaly verze 2.0 Build 1380 (1996) a 3.0.1152 (rovněž 1996)84. Vše bylo opět provozováno na Windows XP Professional. Při výběru konkrétních verzí jsem se řídil zejména jejich momentální dostupností a funkčností v daných podmínkách. 4.6.2 Základní možnosti uživatelského nastavení práce s cookies Nejstarší z testovaných verzí Internet Exploreru ani Navigatoru neumožňovaly uživateli jakékoli nastavení cookies. Jejich přijímání prostě bylo aktivováno vždy. V té době byly pro tyto verze neoficiálně doporučovány nestandardní techniky jejich deaktivace spočívající v přepsání souboru, do kterého se ukládaly, případně jeho nastavení pouze pro čtení. Poprvé bylo (z testovaných verzí) možno u Navigatoru zvolit, že se má před přijetím cookie zobrazit dotaz (viz obrázky 12 a 14). Obdobný mechanismus obsahuje Internet Explorer ve verzi 3 (obrázek 11). Úplná deaktivace cookies nebo zákaz cookies třetích stran stále nebyly možné. Situace, kdy servery odesílaly cookies znovu a znovu (a tedy znovu a znovu byl uživatel dotazován) i když byly odmítnuty ale toto řešení degradovala. Vyšší verze Netscape Navigatoru tak již obsahovala možnost cookies zcela deaktivovat, nebo povolit pouze ty vracené na výchozí (originating) server. Právě to je možnost, kterou lze (ač to z názvu nevyplývá zcela jednoznačně) deaktivovat příjem cookies třetích stran (obrázek 13). 81 Ve skutečnosti jsem na výše uvedených serverech nalezl takové, které šlo spustit, ovšem buď nefungovaly vůbec (verze 4), nebo bohužel nefungoval pouze mechanismus zpracování cookies (verze 5). 82 Na serverech WindowsUpdate 83 Původně také 1.1N a 1.22. Jejich chování co se týče zpracování cookies v testovaných případech však bylo zcela totožné jako u 2.02. 84 Původně také 1.5, ovšem ta cookies nepodporovala vůbec a byla tak předem z testu vyřazena. Strana 43 Kapitola 4: Cookies Obrázek 12: Nastavení varování v NN 3.04 Obrázek 11: Nastavení varování v MSIE 3.0 Obrázek 13: Nastavení cookies v NN 4.03 Obrázek 14: Varování v NN 3.04 Nové prohlížeče již (kromě Internet Exploreru) mají v uživatelských rozhraních zabudované sofistikované cookie-managery, kde uživatel může vidět a případně smazat všechny přijaté cookies (ten v Lynxu je na obrázku 16). V nastavení lze potom nalézt různé možnosti kombinací běžných a cookies třetích stran, omezení délek jejich platnosti a podobně (viz např. obrázek 15 znázorňující možnosti nastavení Mozilly buď klasicky nebo podle politik P3P nebo obrázek 17 ukazující možnosti Opery). Obrázek 15: Nastavení cookies v Mozille 1.8 Obrázek 16: Správa přijatých cookies v Lynxu Strana 44 Kapitola 4: Cookies 4.6.3 Podpora cookies dle specifikace Netscape Jako první byly otestovány cookies dle původní specifikace Netscape. Kromě samotného základního faktu, zda s nimi prohlížeče umějí zacházet (původně do testu zařazený Internet Explorer 1.5 neuměl a proto byl vyřazen) jsem se zaměřil zejména na fungování některých sporných či ve specifikaci nedefinovaných otázek. Zejména šlo o ty, které řešily následné RFC dokumenty jako například práce s porty a parametry Path či Domain. Parametr Path První otázkou bylo, jaké je skutečné výchozí nastavení tohoto parametru, pokud není explicitně specifikován. Test byl proveden uložením cookie, která jej neobsahovala a jejím následným přečtením skriptem z jiného dokumentu ve stejném adresáři. Všechny verze Navigatoru (i z něho vycházející Mozilla) nastavovaly jeho hodnotu na adresu končící adresářem (tedy tak, jak to bylo později definováno v RFC). Projevilo se to tak, že cookie bylo možné přečíst (tj. prohlížeč ji zasílal) i v jiném skriptu z téhož adresáře. Stejně se chovali i Lynx (viz dále), Opera, Konqueror a Internet Explorer od verze 3. Jeho starší verze nastavovala výchozí hodnotu tohoto parametru na celou kompletní adresu dokumentu. Stejné chování se mi podařilo objevit i u starší verze Lynxu (2.8.4pre5). Z uvedeného se dá dovodit, že vývojáři, kteří později do svých prohlížečů implementovali cookies dle specifikace Netscape pochopili tam uvedenou formulaci („same path as the document“) jinak, než jak byla Louem Montullim myšlena. Další otázka týkající se cesty byla ta, zda je možné přijímat cookies s parametrem Path nastaveným na adresář, který neodpovídá adresáři ve kterém se nachází požadovaný dokument. Tedy například pokud server při požadavku na dokument /docs/text.html vrátí cookie s path=/images. Specifikace Netscape to totiž dovolovala, či lépe řečeno nezakazovala. Drtivá většina prohlížečů takovéto cookies přijala a následně i (do příslušných adresářů) odesílala. Pouze Lynx v takovém případě zobrazil varování s dotazem, zda cookie přijmout (a to i když byla zvolena možnost přijímat všechny cookies). Ještě bohatší možnosti má v tomto případě Opera. Ta dovoluje předem zvolit, zda uživatel hodlá takovéto cookies přijímat a jestli si předtím přeje být varován. Možnosti nastavení Opery ukazuje obrázek 17. Poslední otázka ohledně cesty v cookies se váže k jednomu konkrétnímu příkladu ve specifikaci Obrázek 17: Nastavení cookies v Opeře 7.54 Netscape. Je tam totiž psáno, že cookies s parametrem Path=/foo mají být zasílány spolu s požadavky na dokumenty s adresou začínající /foo/bar, tak ale také /foobar. Zajímalo mne tedy chování prohlížečů, pokud hodnota parametru nekončila lomítkem. Podle popsaného pravidla se chovaly všechny testované prohlížeče kromě tří. Konqueror, Mozilla a Lynx cookies tímto způsobem neodesílaly. Tabulka 2: Výsledky testů Netscape cookies s parametrem Path Prohlížeč Výchozí Path Neplatné Path Nekompl. adresář Navigator 2.02 k poslednímu / přijme bez varování odesílá Navigator 3.04 k poslednímu / přijme bez varování odesílá Strana 45 Kapitola 4: Cookies Prohlížeč Výchozí Path Neplatné Path Nekompl. adresář Navigator 4.03 k poslednímu / přijme bez varování odesílá Mozilla 1.8a2 k poslednímu / přijme bez varování neodesílá MSIE 2.0 celá adresa přijme bez varování odesílá MSIE 3.0 k poslednímu / přijme bez varování odesílá MSIE 6.0 k poslednímu / přijme bez varování odesílá Opera 7.54 k poslednímu / lze nastavit příjem i varování odesílá Lynx 2.8.4 k poslednímu / varuje neodesílá přijme bez varování neodesílá (starší verze celá adresa) Konqueror 3.2 k poslednímu / Parametr Domain Zde mě zajímalo především reakce prohlížečů na cookies, která mají nastavenu doménu na jinou hodnotu, než se které přicházejí. Míněna je tím zcela jiná doména a ne pouze doména vyšší úrovně. Překvapivě se objevily dva způsoby jejich zpracování. Kromě běžného odmítnutí (čili neuložení), Internet Explorer 3 a Konqueror takovéto cookies přijali, ale tak, jako by žádný parametr Domain neměly. Nastavili jim tedy doménu výchozí. Opera umožňuje pro takové případy nastavit zobrazení varování (obrázek 17), na rozdíl od varování v případě neplatné cesty je toto pouze informativní a není možné takovou cookie přijmout. Druhou otázkou bylo, jaké hodnoty je možno do parametru Domain nastavit v rámci platné domény. Tedy jednalo se o implementaci onoho „tečkového“ algoritmu ze specifikace Netscape. Navigatory všech verzí akceptovaly hodnoty minimálně s dvěma tečkami (a to jak pro „speciální“ com, tak i pro cz). Pro Mozillu, Operu a Internet Explorer 6 stačila jedna tečka (samozřejmě ale neakceptovaly domény typu .com). Konqueror akceptoval vlastně jakoukoli hodnotu, pokud však nebyla vyhovující, pracoval s ní v duchu výsledku předchozího testu – tj. dosadil implicitní doménu. Velmi zajímavá zjištění jsem učinil u Internet Exploreru. Ten totiž ve své verzi 2 přijímal také doménu nastavenou na .com a co víc, takové cookies potom také odesílal. Verze 3 je sice ještě také přijímala, ale zacházela s nimi stejně jako dnes Konqueror tj. dosadila implicitní doménu. U obou těchto verzí jsem také přišel na další zajímavost, pokud byla doména nastavena například na example.com, odesílaly se příslušné cookies také do domény anotherexample.com – čili fungovalo to obdobně jako u porovnávání cesty. Tabulka 3: Výsledky testů Netscape cookies s parametrem Domain Prohlížeč Cizí doména Přípustná doména Navigator 2.02 nepřijme dvě tečky Navigator 3.04 nepřijme dvě tečky Navigator 4.03 nepřijme dvě tečky Mozilla 1.8a2 nepřijme jedna tečka ale platná doména MSIE 2.0 nepřijme jedna tečka i .com a odesílá! MSIE 3.0 přijme jako výchozí jedna tečka ale jako výchozí MSIE 6.0 nepřijme jedna tečka ale platná doména Strana 46 Kapitola 4: Cookies Prohlížeč Cizí doména Přípustná doména Opera 7.54 nepřijme a umí varovat jedna tečka ale platná doména Lynx 2.8.4 nepřijme jedna tečka ale platná doména Konqueror 3.2 přijme jako výchozí jedna tečka ale platná doména Různé porty Debata ohledně portů a konečné začlenění nového parametru do RFC 2965 mě inspirovaly k provedení testu, který by ukázal, jak je s porty zacházeno v implementacích starší verze cookies v jednotlivých prohlížečích. Testoval jsem nejen komunikaci cookies napříč dvěma různými porty, ale také to, zda prohlížeče rozlišují situace, kdy se užívá výchozí port a kdy se uvede port 80 explicitně v URI. Logicky je to sice stejné, nicméně v zápisu to vypadá jinak a tak by to některým prohlížečům mohlo dělat potíže. Všechny Navigatory odesílaly cookies pouze na ten port, ze kterého je přijaly. Navíc přitom rozlišovaly právě mezi „žádným“ portem a explicitně uvedeným portem 80. Internet Explorer 2 odesílá rovněž pouze na stejný port, ale uvedené dvě alternativy nerozlišuje. Stejně se chová i Konqueror. Internet Explorer od verze 3, Mozilla, Lynx i Opera odesílají na všechny porty. Tabulka 4: Výsledky testů Netscape cookies a portů Prohlížeč Odesílá na porty Rozlišuje „žádný“ a 80 Navigator 2.02 původní ano Navigator 3.04 původní ano Navigator 4.03 původní ano Mozilla 1.8a2 všechny - MSIE 2.0 původní ne MSIE 3.0 všechny - MSIE 6.0 všechny - Opera 7.54 všechny - Lynx 2.8.4 všechny - Konqueror 3.2 původní ne 4.6.4 Podpora cookies dle RFC 2109 Druhá sada testů byla již početně menší a týkala se cookies tak, jak je popisoval dokument RFC 2109. Zde mi šlo hlavně o samotnou funkčnost a také o implementaci novinek. Kromě nových parametrů to byla také syntaxe hlaviček umožňující hodnoty uzavírat do uvozovek. Vzhledem k předem požadované kompatibilitě s předchozí specifikací nenastaly u drtivé většiny prohlížečů potíže. Jediný zásadní problém se vyskytl u Internet Exploreru 2 a to ten, který byl zmiňován v subkapitole 4.4.1. Jako název cookie byl interpretován poslední neznámý parametr a proto se místo cookies zprvu objevovaly hodnoty Version=1. Pro další (mimochodem výsledkově velmi zajímavé) pokusy s touto verzí jsem proto zapsal skutečné názvy cookies až na konec hlaviček. Strana 47 Kapitola 4: Cookies Nahrazení parametru Expires parametrem Max-Age v této verzi reflektovaly pouze Mozilla, Lynx a Konqueror. Všechny tři prohlížeče akceptovaly oba parametry. Druhý z nových parametrů – Comment zobrazuje pouze Lynx (ovšem až po přijetí cookie v cookie manageru). Jistým způsobem to také dělá Opera, neboť ta v případném varování zobrazuje kompletní hodnotu celé hlavičky. Verzi cookies a další informativní proměnné v hlavičce Cookie ($Path atp.) odesílaly pouze Lynx a Konqueror. Z toho tedy plyne, že ostatní zřejmě nerozlišují Netscape cookies a RFC 2109 cookies a jejich kompatibilita je spíše dána zpětnou kompatibilitou celého standardu. Jedinou výjimkou tu je parametr Max-Age v Mozille. Velmi zajímavým bylo testování uvozovek. Ty jsem testoval na hodnotách různých parametrů cookies a nejzajímavější výsledky přinesly cesta a doména. Pokud se totiž v některém z nich objevily uvozovky, neuměly si s nimi poradit (tj. odstranit) následující prohlížeče: žádný z Navigatorů, Internet Explorer 3 ani 6 a kupodivu ani Mozilla. Takové cookies tedy potom nebyly na servery odesílány, neboť jejich cesta či doména (včetně uvozovek) neodpovídala. Velmi šokující bylo zjištění, že Internet Explorer 2 parametry v uvozovkách zvládá a zachází s nimi korektně. Tabulka 5: Výsledky testů cookies dle RFC 2109 Prohlížeč Zákl. kompatibilita Max-Age $vars v Cookie Comment Uvozovky Navigator 2.02 ano ne ne ne ne Navigator 3.04 ano ne ne ne ne Navigator 4.03 ano ne ne ne ne Mozilla 1.8a2 ano ano ne ne ne MSIE 2.0 ne ne ne ne ano MSIE 3.0 ano ne ne ne ne MSIE 6.0 ano ne ne ne ne Opera 7.54 ano ne ne celá hlavička ano Lynx 2.8.4 ano ano ano ano, až poté ano Konqueror 3.2 ano ano ano ne ano 4.6.5 Podpora cookies dle RFC 2965 Jak již bylo řečeno v kapitole o cookies, z mnoha různých důvodů v současnosti platný standard tedy RFC 2965 nebyl všeobecně přijat. Vzhledem k datu jeho vydání připadala případná podpora teoreticky v úvahu pouze u nových prohlížečů. Žádný ze dvou hlavních producentů (Microsoft ani Netscape) jej ale do svých produktů nezabudoval. Bohužel ani Mozilla, která vychází ze starších verzí Navigatoru, jej v sobě (zřejmě kvůli v této situaci mizivé poptávce) nemá implementován. Z prohlížečů zahrnutých do testu jej tedy podporují pouze Opera, Lynx a Konqueror. V testech jsem se zaměřil zejména na nové parametry a také na některé další detaily ze specifikace. Opera sice nerozlišuje Netscape a RFC 2109 cookies, ale ty dle RFC 2965 pozná a to včetně u nich uvedeného parametru Max-Age. Správně v tomto případě také posílá v hlavičce Cookie verzi a další proměnné. Jako jediná také rozumí rozšíření domény pro intranety pomocí přípony .local a korektně pracuje s parametrem Discard. Má také rozhraní, které má sloužit k zobrazení obsahů parametrů Comment a CommentURL, ovšem nezachází s nimi bohužel korektně a zobrazuje místo nich nesrozumitelné znaky (čtverečky). Další její slabina spočívá v parametru Port. Pokud je uveden Strana 48 Kapitola 4: Cookies pouze jako název, potom v rozporu se specifikací dále odesílá cookies na všechny porty. Správně se chová, jestliže má jako hodnotu uveden jeden konkrétní port. Pak odesílá skutečně pouze na tento jeden. Jakmile se ale objeví portů více (oddělených čárkami), název cookie je nahrazen číslem posledního portu v seznamu a jako hodnota se uloží prázdný řetězec. Celá cookie tak je znehodnocena a není správně přijata. Lynx má implementováno RFC 2965 téměř vzorově. Jediný jeho nedostatek je, že nepodporuje virtuální doménu nejvyšší úrovně .local používanou pro práci v intranetech. Jisté výhrady snad lze mít k tomu, že jak Comment tak i CommentURL je možno zobrazit až po přijetí cookie. Je to však dáno textovým charakterem tohoto prohlížeče, kdy je pro většinu interaktivních dialogů užito jediného řádku. Konqueror neumožňuje tyto informace zobrazit vůbec a také on nemá podporu pro doménu .local. Dále uchovává cookies se stanovenou dobou platnosti, přestože mají nastaven parametr Discard. Rovněž zde je implementace portu nepřesná. Pokud je uveden pouze název odesílá se jen na výchozí port, jinak na všechny. Toto je také jediný prohlížeč, který přijme cookie, která má port nastaven zcela jiný než ten, ze kterého přišla. Ostatní funkce jsou nicméně implementovány správně. Tabulka 6: Výsledky testů cookies dle RFC2965 Prohlížeč Zákl. kompatibilita Port CommentURL .local Discard Mozilla 1.8a2 ne - - - - MSIE 6.0 ne - - - - Opera 7.54 ano s problémy celá hl.+nefunkční rozhraní ano ano Lynx 2.8.4 ano správně ano, až poté ne ano Konqueror 3.2 ano s problémy ne ne ne 4.6.6 Shrnutí výsledků Z výše popsaných výsledků provedených testů vyplývá bohužel relativně chabá implementace RFC standardů cookies v současných majoritních prohlížečích. V několika málo ostatních je jejich podpora na velmi vysoké úrovni (např. u Lynxu téměř dokonalá). Pro širší použití na straně serveru z toho však (při zachování požadavku na vysokou míru kompatibility) plyne nutnost spolehnout se na původní formát cookies podle Netscape. Je však třeba mít přitom na paměti jeho jistou zranitelnost zejména podstrčením dat z jiné domény (tzv. cookie-spoofing viz stranu 34). Strana 49 Kapitola 5: Udržování stavových informací na serveru 5 Udržování stavových informací na serveru Výše popsané metody přenosu stavových informací85, ať již čistě prostředky protokolu HTTP a nebo pomocí cookies, spoléhaly vesměs na stejný princip. Server poslal informace klientu, ten je určitým způsobem po dobu přerušení spojení udržoval a při dalším požadavku je poslal serveru zpět. Existuje také jiný přístup, kdy některé stavové informace zůstanou uloženy na serveru. Také v tomto případě je nicméně nutné použít některou z předcházejících metod k přenosu identifikátoru. 5.1 Ukládání stavových informací V některých případech není vhodné (či možné) přenášet veškeré stavové informace od klienta na server s každým požadavkem. Může to být z důvodů kapacitních či jiných. V takovém případě je možné je ukládat v datových souborech na serveru. Podmínkou nicméně je, aby množina dat vážící se ke danému uživateli, byla nějak označena a odlišena od množin dat ostatních uživatelů. Server však pouze z čistého HTTP požadavku nepozná, která z těchto množin „patří“ danému uživateli, neboť kvůli bezstavovosti protokolu neodliší požadavky od různých uživatelů. Je proto nezbytné některou z výše popsaných metod spolu s požadavkem odeslat také identifikační stavovou informaci. Nejde tedy o další novou metodu přenosu stavových informací, ale o změnu místa, kde jsou vlastní stavové informace udržovány. Přenášen je pouze identifikátor a případně některé transakční informace, které se váží k prováděným transakcím. Algoritmy zajišťující základní funkce (tj. zejména přidělení identifikátoru, zajištění jeho přenosu, uložení požadovaných informací pod tímto identifikátorem na serveru, přečtení identifikátoru z požadavku, znovunačtení jemu odpovídajících informací a mazání neplatných informací) mohou být implementovány různě. Nejčastěji jsou na serveru informace ukládány do zvláštních souborů případně do databází (nejčastěji relačních). Mnohá prostředí pro vývoj webových aplikací dnes již často mají takovéto funkce přímo připravené a dostupné webovým programátorům (viz např. [21]). Nezřídka jsou tyto funkce uzpůsobeny k několika možným způsobům přenosu identifikátorů. Pokud je například při spojení s klientem zjištěno, že ten nepodporuje cookies, jsou identifikátory automaticky dogenerovány do URI všech odkazů. Je tak vytvořena jakási vložená vrstva mezi protokolem HTTP a samotnou aplikací, která umožňuje programátorovi i v bezstavovém prostředí WWW, pracovat obdobně, jako by se jednalo o prostředí stavové86. 5.2 Ohrožení identifikátorů relací Při používání těchto vestavěných funkcí je ovšem třeba dávat pozor na bezpečnost. Ač jinak jsou vcelku propracované, nejspíše z důvodu maximální kompatibility nemívají zabudována téměř žádná bezpečnostní opatření. Pokud se někomu cizímu podaří získat identifikátor relace, může pak v rámci aplikace přistupovat k informacím náležejícím k tomuto identifikátoru. V následujících několika krátkých subkapitolách se pokusíme upozornit na některé základní možné způsoby úniku identifikátoru relace a možné způsoby ochrany proti nim. Popsané případy se však nevztahují pouze na bezpečnost přenosu identifikátorů při udržování stavových informací na straně serveru. Mají obecnou platnost pro přenos veškerých informací dotčenými metodami. 85 S výjimkou v praxi téměř nepoužitelných identifikátorů v podobě IP adresy, HTTP autentizace a hlavičky From. 86 Identifikátory těchto vestavěných funkcí lze snadno zjistit podle názvů (pokud jim je správce serveru nezmění). V prostředí PHP je to například PHPSESSID, pro ASP názvy začínající ASPSESSID a podobně. Strana 50 Kapitola 5: Udržování stavových informací na serveru 5.2.1 Odhadnutí Pokud je identifikátor relace příliš jednoduchý, například jej představuje pouze pořadové číslo, velice snadno to může lákat případného útočníka ke snaze o odeslání jiného identifikátoru. Jako identifikátory by tedy měly být v těchto případech voleny složitější kombinace znaků. Ideální jsou například výstupy hašovacích funkcí, které mají konstantní délku. Je nutno podotknout, že takováto přílišná jednoduchost identifikátorů není nedostatek, kterým by mechanismy vestavěné v prostředích trpěly. Blíže k požadavkům na složitost identifikátoru viz [32]. Pokud jsou tyto požadavky splněny, mělo by být velmi nepravděpodobné, že by se útočníkovi podařilo cizí identifikátor odhadnout. 5.2.2 Odposlechnutí z komunikace Případné odhadnutí hrozí zejména těm identifikátorům, které jsou od počátku špatně navrženy. I ty ostatní jsou ale během přenosu v mnohem větším ohrožení. Pokud se nejedná o HTTP spojení přes šifrovaný kanál, jsou veškerá data posílána v odkryté a tedy pro kohokoliv „na cestě“ čitelné podobě. Takto je možné získat identifikátor relace přenášený nejen v různých formách zakódovaný do URI (který se navíc bude na mnoha místech ukládat do logů). Úplně stejně se lze dostat k obsahu dat z formuláře odeslaného metodou POST, či k hlavičce obsahující cookie. Zcela zamezit je tomu možné pouze použitím spolehlivého šifrovaného spojení. 5.2.3 Hlavička Referer Další potenciální hrozbou je ona již také několikráte zmiňovaná hlavička Referer. V případě, že je k přenosu identifikátoru použito některé z metod využívajících jeho zakódování do URI, hrozí právě zde asi největší nebezpečí jeho prozrazení. Tato hlavička je totiž mimo jiné odesílána spolu s požadavky na všechny vložené objekty. Pokud se útočníkovi podaří vložit do takové stránky odkaz například na obrázek, který je umístěn na serveru k němuž má přístup, v hlavičce referer získá i požadovaný identifikátor. V aplikacích, kde je možné, že do zdroje stránky bude vložen nějaký cizí obsah (jako jsou kupříkladu elektronická pošta či diskusní fóra), je proto nutné buď zamezit vkládání HTML tagů, případně vložené odkazy přepsat, aby nevedly přímo k cíli. To se řeší tak, že ukazují na nějaký skript, v jehož URI není identifikátor relace a ten teprve provede (většinou automaticky HTTP stavovým kódem) přesměrování na původní cíl. 5.2.4 Některé možnosti ochrany před zneužitím identifikátoru Pokud z nějakého důvodu nelze využít šifrovaného spojení a hrozí tedy nebezpečí prozrazení identifikátoru, je možné použít některé z metod ochrany před jeho zneužitím. Žádná z nich není stoprocentně úspěšná, většina jich však má své opodstatnění a může ztížit jisté typy útoků. Někdy bývá používána kontrola hlavičky Referer. Tu ale jednak některé prohlížeče neposílají, a navíc je ji poměrně snadné podvrhnout87. Gunter Ollmann[32] jako jisté vylepšení navrhuje generování dočasných identifikátorů také pro jednotlivé stránky a kontrolování opět hlavičkou Referer, zda uživatel prochází webem v dovoleném pořadí. Poměrně často užívaným způsobem je vypršení platnosti relace po uplynutí určitého časového intervalu nečinnosti. Na implementaci toto opatření nebývá složité a zabraňuje poměrně účinně možnému pozdějšímu útoku například po dodatečném přečtení identifikátoru z logu. Tak je tomu ovšem pouze za předpokladu, že je implementován přímo v aplikaci na serveru a ne pouze jako 87 Tato metoda zřejmě spoléhá na to, že to je řádově složitější, než pouze zkopírovat URI do prohlížeče. Strana 51 Kapitola 5: Udržování stavových informací na serveru omezení platnosti odesílaných Cookies. Pokud je identifikátor obsažený v cookie platný i po jejím vypršení, nemá toto opatření požadovaný efekt, neboť útočník má tento platný identifikátor stále k dispozici. Jako velmi účinná se ukazuje být kontrola IP adresy, ze které se klient připojuje. Tu je velmi obtížné podvrhnout a útočník tak získaný identifikátor, pokud jej neodešle ze stejné IP adresy jako oprávněný uživatel, nemůže použít. Mohlo by se tak stát, pokud by oba například přistupovali k webu přes stejný proxy server. To již ovšem značně zužuje množinu možných úspěšných útočníků. Je navíc možné použít hlavičku X-Forwarded-For, kterou posílají některé proxy servery. Zdálo by sem, že je tak možné vyřešit situace, kdy jsou jednotlivé požadavky jednoho klienta vyřizovány postupně několika proxy servery. Bohužel situace není tak snadná, neboť nelze jednoduše tuto hlavičku, pokud je přítomna, porovnávat namísto skutečné IP adresy. Hlavičku lze totiž velmi snadno podvrhnout a celý jinak poměrně účinný systém tak snadno ošidit. 5.3 Shrnutí Zmínili jsme také druhý základní princip udržování stavových informací v prostředí WWW. Tím je jejich uchovávání na straně serveru. Kvůli bezstavovosti protokolu HTTP je ovšem i v tomto případě nutný přenos identifikačních informací spolu s požadavkem a tedy platí pro něj většina toho, co bylo řečeno v kapitolách 3 a 4. Kvůli výlučnosti identifikátoru jsme také krátce pohovořili o základních východiscích, která je nutno mít při jeho ochraně na paměti. Samozřejmě jsme zde nevyjmenovali ani zdaleka veškeré možné způsoby útoků88. K některým dalším souvislostem viz např. [49] a [51]. 88 Například jsme vynechali celou bohužel širokou oblast využití bezpečnostních chyb a nedostatků v prohlížečích nejčastěji ve spojení se skriptovacími jazyky. Strana 52 Kapitola 6: A.S.I.A.T. 6 A.S.I.A.T. Jako hlavní praktickou součást této práce jsem se rozhodl vytvořit aplikaci, která by určitým způsobem automaticky rozpoznávala metody přenosu stavových informací v prostředí protokolu HTTP použité na konkrétních URI. Tuto aplikaci jsem pojmenoval A.S.I.A.T. To je zkratka anglických slov Automated State Information Analyzing Tool – tedy česky automatizovaný nástroj pro analýzu stavových informací. 6.1 Uživatelské rozhraní Aplikace A.S.I.A.T. Má velmi jednoduché uživatelské rozhraní (viz obrázek 18). V horní části okna je vstupní pole pro adresu, která má být otestována a tlačítko pro její potvrzení (funguje také Enter ve vstupním poli). Výstupy se vypisují do centrální části okna a to v textové podobě. Ve zcela spodní části okna je potom několik zaškrtávacích políček, kterými je možno ovlivnit výstup aplikace. Zatrhnutí prvního z nich způsobí zobrazení požadavku tak, jak je aplikací odesílán89. Druhé naopak vede k zobrazení hlaviček obdržených s přijatým dokumentem. Následující tři políčka zapínají zpracování samotné analýzy stavových informací (viz dále). Pokud je zvoleno zpracování odkazů, jsou s cílovým serverem uskutečněna dvě samostatná spojení90. Posledním políčkem lze zvolit zobrazení těla obdrženého dokumentu (po případném dokódování chunked encoding). Obrázek 18: A.S.I.A.T.: Uživatelské rozhraní aplikace 6.2 HTTP klient Již od počátku bylo zřejmé, že takováto aplikace bude muset být z podstatné části HTTP klientem. Celý návrh tak vychází z poměrně důsledné implementace základních součástí protokolu HTTP 1.1 (dle RFC 2616). Soustředil jsem se na podstatné základy a v této implementaci se tak vyhnul náročnějším a pro své potřeby nadbytečným vlastnostem. Není tak implementováno například perzistentní spojení (nicméně tato skutečnost je v požadavcích korektně označena hlavičkou Connection: Close), podpora pro přenos neúplných dokumentů (byte range), proxy, či různá kódování dokumentů91 (např. komprimace). Všechny tyto skutečnosti jsou samozřejmě signalizovány příslušnými HTTP hlavičkami v požadavku (resp. jejich absencí). Oproti tomu právě práce s HTTP hlavičkami je velmi důsledná včetně například zpracování kombinovaných hlaviček (spojení více hlaviček stejného názvu do jediné) nebo lomených hlaviček (pokračujících na dalším řádku). Implementovány jsou rovněž korektní postupy pro určení délky dokumentu, včetně zpracování základního přenosového kódování v HTTP 1.1 – totiž chunked encoding. 89 Z implementačních důvodů nemusí být pořadí hlaviček stejné. 90 Kromě případů, kdy dokument neobsahuje žádný odkaz a druhé spojení by tudíž bylo zbytečné. 91 S čestnou výjimkou základního přenosového kódování v HTTP 1.1 totiž chunked encoding. Strana 53 Kapitola 6: A.S.I.A.T. Jako poslední poznámku k tomuto tématu je nutno uvést, že ač jinak jsem se snažil postupy zpracování URI implementovat co možná nejpřesněji podle standardů, v zadaných adresách nejsou v jednotlivých částech URI zakódovávány znaky se speciálním významem (například %, / či mezera). Je to z toho důvodu, že je předpokládáno využití aplikace spolu s klasickým prohlížečem, ze kterého jsou do ní adresy kopírovány. Prohlížeče již toto překódování provádějí a jeho znovuprovedení by bylo kontraproduktivní a vedlo by k jiným než očekávaným výsledkům. 6.3 Práce se stavovými informacemi Kromě čistého HTTP klienta (pro získávání odpovědí na požadavky), bylo pro samotnou analýzu případných takto získaných stavových informací nutno implementovat algoritmy, které by je byly schopny detekovat. Z výše zmiňovaných způsobů přenosu jde o zakódování informací do URI (všechny tři způsoby), skrytá formulářová pole a samozřejmě cookies. Ostatní způsoby jsou velmi zřídka používány a kromě toho je buď obtížné je detekovat (IP adresa jako identifikátor), nebo je jejich užití zřejmé již při použití běžného prohlížeče (HTTP autentizace). 6.3.1 Cookies Opravdu téměř kompletní podpora je implementována pro cookies. Je tomu tak zejména proto, že jde o mechanismus přímo určený k přenosu stavových informací a je tedy velmi snadné jeho použití přesně identifikovat92. Aplikace umí důsledně rozlišovat všechny tři druhy cookies (Netscape, RFC 2109, RFC 2906) a pracovat s jejich parametry. Mimo jiné zobrazuje dobu platnosti a to, zda by daná cookie (dle příslušné specifikace) měla, či neměla být přijata93. Bohužel protože servery, které by pro ukládání stavových informací používaly cookies dle RFC 2965 na internetu prakticky neexistují, musel jsem si skripty, které to dělají napsat sám. Protože tato aplikace nemá v žádném případě nahrazovat prohlížeč, cookies nejsou nijak uchovávány a odesílány s dalšími požadavky94. Výhodou takového řešení je tak jednoduchá možnost otestovat za stejných výchozích podmínek znovu stejné URI. Výstup při přijetí cookie s mnoha parametry dle RFC2616 ukazuje obrázek 19. Obrázek 19: A.S.I.A.T.: Přijetí cookie 92 Na rozdíl od ostatních tak není třeba užívat různých do jisté míry heuristických metod. 93 Zde jsem uplatnil svůj (většinou doslovný) výklad specifikací a chování se proto (i díky striktnímu odlišování jednotlivých typů cookies) může lišit od zacházení klasických prohlížečů. 94 I když architektura aplikace na to připravena je a nebylo by obtížné tuto vlastnosti doimplementovat. Strana 54 Kapitola 6: A.S.I.A.T. 6.3.2 Formuláře Samotná přítomnost nějakého formuláře v dokumentu zpravidla vede k jeho užití při přenosu stavových informací. Aplikace A.S.I.A.T. proto v tělech dokumentů vyhledává také právě formuláře. Ve formulářích může být obecně přenášeno téměř cokoli. Dále rozpoznávány jsou tedy pouze potenciální identifikační informace, pro které bývají využívána skrytá formulářová pole. Ta jsou proto také spolu s metodou, která by byla použita k odeslání formuláře, zobrazována na výstupu aplikace. 6.3.3 Odkazy a URI Poslední detekovanou metodou přenosu stavových informací je zakódování do URI. Zde jsou detekovány pouze případné identifikační informace, neboť o ostatních svědčí například jen přítomnost části query v URI. Detekce probíhá přibližným algoritmem, který nezaručuje jejich jisté odhalení, nicméně ve standardních případech je poměrně úspěšný. Jeho základním principem je opětovné načtení dokumentu z testované adresy a porovnání cílů sobě odpovídajících odkazů. Pokud jsou do odkazů vkládány pouze identifikátory, měly by se URI lišit právě v jedné své části (například adresář v path či proměnná v query). Právě takto je porovnáváno maximálně patnáct prvních odkazů a případné odlišnosti jsou reportovány jako možné stavové informace. Protože velice často bývá stejný identifikátor zakódován ve více odkazech, jsou ignorovány ty, které jsou stejné, jako v předchozím odkazu. Obrázky 20 a 21 ukazují příklady úspěšně identifikovaných stavových informací (jak v path, tak v query) v knihovních systémech Aleph v Národní knihovně a Centru informačních a knihovnických služeb Vysoké školy ekonomické v Praze. Obrázek 20: A.S.I.A.T.: Identifikátor v query odkazů na webu CIKS Obrázek 21: A.S.I.A.T.: Identifikátor v cestě odkazů v Národní knihovně Strana 55 Kapitola 6: A.S.I.A.T. 6.4 Návrh aplikace Vzhledem k jisté vrstevnatosti řešené problematiky (HTTP spojení, pod ním cookies v hlavičkách a tělo s formuláři a odkazy) a také variantám cookies, které jsou v některých detailech odlišné, jsem se rozhodl využít objektový návrh i konečnou realizaci celé aplikace. Nejdůležitější třídy reprezentují základní prvky HTTP spojení – tedy požadavek, odpověď a k nim náležející hlavičky. Ke každé odpovědi se váží zvláštní třídy, které spravují v ní obsažené cookies, formuláře a odkazy. Cookies obecně jsou dohromady reprezentovány abstraktní třídou BaseCookie, jejímiž potomky jsou potom tři konkrétní jejich implementace. Pro jejich různé chování ve stejných situacích je využit princip polymorfismu (konkrétně přetěžování metod). Model tříd základních prvků aplikace (bez grafického rozhraní) představuje obrázek 22. Zejména kvůli dobré podpoře objektového přístupu, přísné typové kontrole a v neposlední řadě nezávislosti na konkrétní platformě jsem pro implementaci zvolil programovací jazyk Java (konkrétně jeho verzi 1.4.1) Obrázek 22: A.S.I.A.T.: Model tříd aplikace Strana 56 Závěr Závěr V bakalářské práci jsem na pozadí historického vývoje služby World Wide Web a protokolu HTTP popsal hlavní metody udržování stavových informací v prostředí WWW. Jejich základem je udržování alespoň části informace na straně klienta a její přenos zpět k serveru prostřednictvím požadavku. K tomu jsou užívány jednak metody spoléhající pouze na protokol HTTP – zejména různé způsoby zakódování do URI a formulářová pole. Dále potom speciální rozšíření protokolu HTTP pro práci se stavovými informacemi – cookies. Ty existují ve třech standardizovaných podobách. Jak vyplynulo z provedených testů, pouze nejstarší z nich je podporována hlavními webovými prohlížeči a tudíž masově používána. Zmínil jsem také některé další způsoby udržování stavových informací. Naznačeny byly některé otázky, týkající se bezpečnosti přenosu informací. Výsledkem praktické části je funkční multiplatformní aplikace, která v sobě spojuje hlavní vlastnosti jednoduchého HTTP klienta s podporou základních funkcí a velice jednoduchého prohlížeče s plně implementovanými třemi verzemi cookies. Tato kombinace může být úspěšně využita pro snadnou detekci nejběžnějších způsobů přenosu stavových informací za pomoci protokolu HTTP použitých na konkrétních adresách. Strana 57 Rejstříky vložených tabulek a obrázků Rejstříky vložených tabulek a obrázků Rejstřík tabulek Vhodnost metod přenosu prostředky HTTP pro různé typy informací.............................................. 29 Výsledky testů Netscape cookies s parametrem Path......................................................................... 45 Výsledky testů Netscape cookies s parametrem Domain................................................................... 46 Výsledky testů Netscape cookies a portů........................................................................................... 47 Výsledky testů cookies dle RFC 2109................................................................................................48 Výsledky testů cookies dle RFC2965.................................................................................................49 Rejstřík obrázků Opakovaný požadavek v HTTP s vyznačením otevíraných spojení...................................................10 Použití proxy serveru..........................................................................................................................10 Použití cache v HTTP.........................................................................................................................10 Opakovaný požadavek v HTTP při perzistentním spojení................................................................. 15 Opakovaný požadavek v HTTP při perzistentním spojení a pipeliningu........................................... 15 Příklad vyjednávání o obsahu v HTTP...............................................................................................17 Přenos informací mezi vloženým objektem a serverem mimo rámec protokolu HTTP.................... 22 Fragment HTML kódu s formulářem se skrytým polem a jeho grafická reprezentace v prohlížeči.. 26 Obecné použití cookies.......................................................................................................................30 Neověřitelné transakce a užití cookies třetích stran k profilování......................................................35 Nastavení varování v MSIE 3.0..........................................................................................................44 Nastavení varování v NN 3.04........................................................................................................... 44 Nastavení cookies v NN 4.03............................................................................................................. 44 Varování v NN 3.04............................................................................................................................44 Nastavení cookies v Mozille 1.8........................................................................................................ 44 Správa přijatých cookies v Lynxu...................................................................................................... 44 Nastavení cookies v Opeře 7.54......................................................................................................... 45 A.S.I.A.T.: Uživatelské rozhraní aplikace..........................................................................................53 A.S.I.A.T.: Přijetí cookie.................................................................................................................... 54 A.S.I.A.T.: Identifikátor v query odkazů na webu CIKS................................................................... 55 A.S.I.A.T.: Identifikátor v cestě odkazů v Národní knihovně............................................................ 55 A.S.I.A.T.: Model tříd aplikace.......................................................................................................... 56 Strana 58 Seznam použité literatury Seznam použité literatury [1] The Apache Software Foundation: Apache HTTP server project [online] <http://httpd.apache.org/> [5.8.2004] [2] Apache Week: HTTP/1.1 [online] <http://www.apacheweek.com/features/http11> [5.8.2004] [3] AT: AT&T Privacy Bird. [online] <http://privacybird.com/> [5.8.2004] [4] BALCAR, Z.: Cookies. Strategie, 2002, s. 51. ISSN 1210-3756. [5] BERNERS-LEE, T.: The Original HTTP as defined in 1991. [online] <http://www.w3.org/Protocols/HTTP/AsImplemented.html> [5.8.2004] [6] BRAIN, M.: How Internet Cookies Work. [online] <http://www.howstuffworks.com/cookie.htm> [5.8.2004] [7] COBB, CH.: Cookies - Are You Ready?. [online] October 1996 <http://www.cheycobb.com/cookies.html> [5.8.2004] [8] COHEN, J <[email protected]>: 305/306 response codes In W3C Public Mailing List Archives. [online] Fri, 6 Jun 1997 <http://lists.w3.org/Archives/Public/ietf-http-wgold/1997MayAug/0236.html> [5.8.2004] [9] CRANOR, L.: Help! IE6 Is Blocking My Cookies. [online] 2002 <http://www.oreillynet.com/pub/a/javascript/2002/10/04/p3p.html> [5.8.2004] [10] EICHELBERGER, L.: The Cookie Controversy. [online] April 1998 <http://www.cookiecentral.com/ccstory/> [5.8.2004] [11] EPIC: Cookies. [online] November 2002 <http://www.epic.org/privacy/cookies/default.html> [5.8.2004] [12] Evolt Browser Archive[online] <http://browsers.evolt.org/> [5.8.2004] [13] FEHLBERG, N.: P3P, Cookies and IE6.0: A Case Study. [online] March 2004 <http://www.sitepoint.com/article/p3p-cookies-ie6> [5.8.2004] [14] FUSCO, P.: The Way the Cookie Crumbles. [online] February 2000 <http://www.ispplanet.com/politics/cookie_crumbles.html> [5.8.2004] [15] KASTL, J.: Informační a komunikační systémy. 1. vyd. Praha, Vysoká škola ekonomická v Praze 1999. 123 s. ISBN 80-245-0001-9. [16] KOPTA, M.: Spam, cookies a šmírování podle Evropské unie. [online] leden 2002 <http://www.lupa.cz/clanek.php3?show=2002> [5.8.2004] Strana 59 Seznam použité literatury [17] KOSEK, J.: PHP - Tvorba interaktivních internetových aplikací. 1. vyd. Praha, Grada Publishing 1998. 492 s. ISBN 80-7169-373-1. [18] KRISTOL, D. M.: HTTP Cookies: Standards, Privacy, and Politic. ACM Transactions on Internet Technology (TOIT), Volume 1, 2001, Issue 2, p. 151-198. ISSN 1533-5399. [také online] <http://doi.acm.org/10.1145/502152.502153> [5.8.2004] [19] MACAVINTA, C.: DoubleClick, Abacus merge in $1.7 billion deal, News.com, 1999. [20] MACAVINTA, C.: Privacy advocates rally against DoubleClick-Abacus merger, News.com, 1999. [21] MACH, J.: Udělejte si sezení (Sesson management v PHP). Connect, roč. 6, 2001, č. 11, s. 32. [22] MATLIS, J.: P3P: Ochrana vašeho soukromí. Computerworld, roč. 13, 2002, č. 43, s. 20. ISSN 1210-9924. [23] MAYER-SCHÖNBERGER, V.: Cookies. [online] <http://www.cookiecentral.com/c_concept.htm> [5.8.2004] [24] MAZUR, J.: Maintaining State Within a Website (w/o Cookies or Server-side Scripting). [online] September 1999 <http://www.webdevelopersjournal.com/columns/stateful.html> [5.8.2004] [25] MIKLE, P.: XDHTML. 1. vyd. Brno, Zoner Press 2004. 208 s. ISBN 80-86815-01-3. [26] MOCEK, M.: Unie chrání mobily a počítače. Mladá fronta Dnes, roč. 14, 2003, č. 258. ISSN 1210-1168 [27] MONTULLI, L.: Lou Montulli: Short Bio. [online] <http://www.montulli.com/lou/> [15.8.2004] [28] Netscape Browser Archive[online] <http://sillydog.org/narchive/> [5.8.2004] [29] Netscape Communications Corp.: Persistent Client State HTTP Cookies. [online] <http://wp.netscape.com/newsref/std/cookie_spec.html> [5.8.2004] [30] Netscape Communications Corp.: OPS Submission request to W3C. 1997 [online] <http://www.w3.org/Submission/1997/6/> [15.8.2004] [31] NEWMARCH, J.: HTTP Session Management. [online] 2000 <http://jan.netcomp.monash.edu.au/ecommerce/session.html> [5.8.2004] [32] OLLMANN, G.: Paper: Web Based Session Management (Best Practices in Managing HTTP Based Client Sessions). [online] <http://www.technicalinfo.net/papers/WebBasedSessionManagement.html> [5.8.2004] Strana 60 Seznam použité literatury [33] PAVLÍČKOVÁ, J.: Úvod do programování v jazyce Java. 1. vyd. Praha, Vysoká škola ekonomická v Praze 2001. 110 s. ISBN 80-245-0238-0. [34] PETERKA, J.: Rodina protokolů TCP/IP, verze 2.0. [online] 1999 <http://www.earchiv.cz/l207/> [15.8.2004] [35] RAYMOND, E. S: The Jargon File (Version 4.4.7).. [online] <http://catb.org/~esr/jargon/html/index.html> [5.8.2004] [36] RFC 1738 Uniform Resource Locators (URL). December 1994. [37] RFC 1808 Relative Uniform Resource Locators. June 1995. [38] RFC 1945 Hypertext Transfer Protocol - HTTP/1.0. May 1996. [39] RFC 2068 Hypertext Transfer Protocol - HTTP/1.1. January 1997. [40] RFC 2109 HTTP State Management Mechanism. February 1997. [41] RFC 2295 Transparent Content Negotiation in HTTP. March 1998. [42] RFC 2396 Uniform Resource Identifiers (URI): Generic Syntax. August 1998. [43] RFC 2616 Hypertext Transfer Protocol - HTTP/1.1. June 1999. [44] RFC 2617 HTTP Authentication: Basic and Digest Access Authentication. June 1999. [45] RFC 2964 HTTP Use of State Management Mechanism. October 2000. [46] RFC 2965 HTTP State Management Mechanism. October 2000. [47] STEIN, L.; STEWART, J: The World Wide Web Security FAQ (Version 3.1.2).. [online] February 2002 <http://www.w3.org/Security/Faq/index.html> [5.8.2004] [48] TILL, M.: Standart ochrany soukromí P3P. [online] <http://www.krypta.cz/articles.php?ID=70> [21.7.2004] [49] TILL, M.: Nástrahy webového programování. Connect, roč. 7, 2002, č. 2, s. 39. [50] TILL, M.: Ochrana osobních údajů na webu. Computerworld, roč. 13, 2002, č. 24, s. 23. ISSN 1210-9924. [51] TILL, M.: Web může být nebezpečnější, než se zdá. Computerworld, roč. 13, 2002, č. 24, s. 21. ISSN 1210-9924. [52] W3C: HTTP Performance Overview. [online] <http://www.w3.org/Protocols/HTTP/Performance/Overview.html> [15.8.2004] Strana 61 Seznam použité literatury [53] W3C: Hypertext Transfer Protocol - Next Generation Overview. [online] December 1999 <http://www.w3.org/Protocols/HTTP-NG/> [15.8.2004] [54] W3C: URIs, URLs, and URNs: Clarifications and Recomendations 1.0. [online] September 2001 <http://www.w3.org/TR/2001/NOTE-uri-clarification-20010921/> [5.8.2004] [55] W3C: Make Your Web Site P3P Compliant. [online] 2002 <http://www.w3.org/P3P/details.html> [5.8.2004] [56] W3C: P3P and Privacy on the Web FAQ. [online] 2002 <http://www.w3.org/P3P/p3pfaq.html> [5.8.2004] [57] W3C: The Platform for Privacy Preferences 1.0 (P3P1.0) Specification. [online] April 2002 <http://www.w3.org/TR/2002/REC-P3P-20020416/> [5.8.2004] [58] Webopedia.com: Cookie [online] <http://www.webopedia.com/TERM/c/cookie.html> [5.8.2004] [59] Webopedia.com: The Difference Between the Internet and the World Wide Web [online] <http://www.webopedia.com/DidYouKnow/Internet/2002/Web_vs_Internet.asp> [15.8.2004] [60] WHALEN, D.: The Unofficial Cookie FAQ (Version 2.6). [online] August 2002 <http://www.cookiecentral.com/faq/> [5.8.2004] Strana 62 Seznam použitých zkratek a termínů Seznam použitých zkratek a termínů CGI Common Gate Interface standard pro komunikaci HTTP serverů s externími programy HTML HyperText Markup Language značkovací jazyk pro zápis WWW dokumentů HTTP HyperText Transfer Protocol protokol pro přenos hypertextu – základní přenosový protokol WWW IETF The Internet Engineering Task Force mezinárodní komunita zabývající se technologickými standardy internetu path cesta zde součást URI označující umístění dokumentu na serveru query dotaz zde součást URI (za otazníkem) obsahující dodatečné informace RFC Request For Comments typ dokumentu vydávaný IETF; některé RFC specifikují standardy internetu session-id identifikátor relace termín užívaný pro jedinečnou identifikační informaci odlišující uživatele tag obecný název pro značku v jazyce HTML; každá značka má konkrétní význam URI Uniform Resource Identifier jednotný identifikátor zdroje – univerzální schema užívané pro adresování zdrojů URL Uniform Resource Locator jednotný ukazatel na zdroj – podmnožina URI identifikuje dokument místem uložení web zde ve smyslu obsah konkrétního HTTP serveru WWW World Wide Web celosvětová pavučina – služba internetu pro přenos hypertextu (HTML) přes HTTP Strana 63 [25][15][36][37][42][54][40][45][46][29][18][35][47][6][60][23][10][7][14][4][58][32][31][21] [49][51][57][56][55][9][22][13][48][50][38][39][43][2][12][28][34][24][3][17][5][52][41][8][53] [59][1][44][27][19][20][26][16][30][33]