Cookies
Jak v PHP použít úložiště v prohlížeči označované jako cookies neboli sušenky?
Výhody
- Nejstarší a stále nejpoužívanější způsob uložení informací u uživatele
- Nejvíce podporovaný napříč všemi prohlížeči
Nevýhody:
- všechny sušenky se posílají při všech požadavcích na server
- doporučená maximální velikost je 4 kB včetně všech názvů, expirací apod.
- jsou pro uživatele volně čitelné i upravitelné
- rozumný počet je okolo 20 - více sušenek by se nemuselo přenášet korektně
- sušenky umí ulkádat pouze řetězce - objekty nebo array se musí serializovat a deserializovat
Vlastnosti
- používají se pro identifikaci uživatele (a mimochodem taky pro jeho sledování)
- pomocí cookie funguje v PHP služba sessions (v sušence nazvané defaultně PHPSESSID)
- sušenky se mohou krást a taky kradou - kdo ji získá, zpravidla se umí přihlásit jako zrovna přihlášený uživatel (pokračuj na session hijack na Wikipedii, session fixation opět na Wikipedii nebo na OWASPu)
- sušenky se proto doplňují řetězci vázající sušenku pro konkrétní prohlížeč, lépe i pro operační systém, rozlišení a podobně. Po krádeži potom zloděj musí všechno toto zreplikovat nebo podvrhnout, což mu ztíží práci
- k sušenkám se dá přistupovat i pomocí JavaScriptu, ale většinou se tento způsob pouze zneužívá pro útok Cross Side Scripting (XSS), proto je vhodné toto vypnout (víc níže)
- zabránit přistoupení k sušenkách přes JS jde pomocí nastavení parametru httponly (víc opět níže)
- kompletně zabezpečit sušenky jde pouze zabezpečeným připojením, typicky HTTPS
Užití v praxi
Vytvoření cookie
Pro uložení sušenky u uživatele použij funkci setcookie()
. V parameterech specifikuješ její název, hodnotu a jak má dlouhou platnost. Podle názvu ji dohledáš při čtení a po skončení platnosti ji prohlížeč sám odstraní. Základní použití může vypadat třeba takto:
<?php
setcookie(
"prefferedLanguage",
$language,
strtotime('+1 year')
);
Pro větší bezpečí se používá funkce takto: setcookie($name, $value, $expire, $path, $domain, $secure, $httponly);
Pro nastavení parametru httponly
je třeba nastavit sedmý parametr na true
. Více o základním zabezpečení sušenek nalezneš na blogu treehouse.
Čtení cookie
Sušenky se posílají na server s každým požadavkem všechny. Pracuje se s nimi přes superglobální array podobně jako třeba hodnoty posíláné metodou GET
nebo POST
. Příklad zjištění preferovaného jazyka uživatelem:
<?php
$language = $_COOKIE["prefferedLanguage"];
Smazání cookie
Správné smazání cookie se skládá ze dvou částí - smazat proměnnou v PHP a smazat sušenku v prohlížeči.
Smazat proměnnou můžeme příkazem unset()
. Smazat cookie v prohlížeči ovšem nelze nijak přímo. Používá se na to trik: sušence se nastaví hodnota pro platnost do minulosti, aby přestala být v současnosti platná. Prohlížeč ji potom smaže sám. Opět uvedu příklad:
<?php
unset($_COOKIE["prefferedLanguage"]); //smaže se pouze jedna konkrétní cookie, ne všechny
setcookie("prefferedLanguage", "", 1); //1 vteřina po začátku počítání unixového času
Další odkazy
Na hackingwithphp je pěkný text o sušenkách - má víc kapitol, doporučuju projít celou sekci.
Too Long, Didn’t Read?
Cookie je dobře podporovaný způsob, jak ukládat informace u uživatele. Měly by ale držel jen krátké kousky informací. Cookie zvládnou ukládat pouze text. Nastavují se přes funkci setcookie("name", "value", (int)$expireTime)
. Přistupuje se do nich přes superglobální array $_COOKIE
. Mažou se pomocí funkce unset()
a u uživatele nastavením expirace do minulosti.