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

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.

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"];

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.

Publikováno 4. 04. 2017
Líbil se ti článek? Napiš komentář, co si o něm myslíš: