PoorSession v jazyku PHP

V minulém článku sem popsal, jak použít implementaci samonosné cookie coby session v jazyku python. Tento článek se bude týkat implementace v jazyku PHP. K článku je samozřejmě připojen i soubor obsahující tuto implementaci.
Pro snazší použití a protože PHP implementace vznikla až po Python implementaci, je rozhraní velmi podobné, s přihlédnutím na zvyklosti v různých jazycích. Přiložený soubor session.php obsahuje funkci hidden, která xoruje vstupní text sha1 hashem z hesla. Díky tomuto mechanismu funkce buď kryptuje nebo de-kryptuje, podle toho, zda je vstupní text již zakryptovaný nebo ne.

Api

Druhou částí kódu je třída PoorSession, její konstruktor přijímá až čtyři parametry, povinným je ale jen jeden, heslo. Další parametry jsou:
  • expire - délka životnosti session. Implicitní hodnota je 0, to znamená, že session (tedy cookie) je platná do té doby, kdy je ukončen browser.
  • path - url cesta, jde o parametr cookie. Implicitní cesta je ‚/‘. Pokud tedy vaše aplikace bude dostupná na adrese www.domena.cz/aplikace/ pak by tato cesta měla být /aplikace/. Tím budou akceptovány i cesty /aplikace/verze/ atd.
  • SID - název cookie. Implicitní hodnota je SESSID. Oproti tomu, standardní název PHP session je PHPSESSID, to znamená, že nedojde ke konfliktu, pokud budou zachovány standardní hodnoty (budou se vzájemně lišit).
Konstruktor vytvoří novou session pokud již žádná neexistuje, byla vadná, nebo vypršela její platnost.

Další práce spočívá ve volání metod, a přístupu k atributu data, což je pole. Podobně jako v implementaci pro jazyk Python, i zde je do tohoto pole uložena i hodnota expire, proto by nikdy neměla být takto pojmenována uživatelská hodnota. Dostupné metody jsou:
  • write() - uloží data session do atributu raw v zaheslované, komprimované, byte64 podobě. Tato metoda je volána z metody send, není ji tedy třeba volat ručně.
  • renew() - znovu nastaví čas expirace session (aktuální čas + hodnota expire z konstruktoru). Pokud je expire rovno 0, je expirace vynulována.
  • destroy() - nastaví čas expirace na -1 rok. Ve skutečnosti může session fyzicky zrušit jen browser, a ten to dělá právě na základě expirace.
  • send() - zavolá metodu write, a php funkci setcookie s nastavenými parametry. Setcookie nastavuje hlavičku odpovědi, je tedy třeba volat tuto metodu ještě před datovým výstupem.

Ukázka

Následující ukázka hned po vytvoření objektu PoorSession otestuje uživatelský vstup, zda nedošlo ke správnému přihlášení. V takovém případě nastaví klientskou IP adresu a pošle browseru hlavičku s cookie. Další krok testuje, zda je uživatel přihlášen a nezměnila se jeho ip adresa. V případě selhání kontroly dojde ke smazání cookie.

<?php

require_once('inc/session.php');

$session = new PoorSession('tajné heslo');

if (isset($_POST['password']) && sha1($_POST['password']) == 'adminheslo'){
$session->data['login'] = true;
if (isset($_POST['ip']))
$session->data['ip'] = $_SERVER['REMOTE_ADDR'];
$session->send();
}

if (!isset($session->data['login']) ||
(isset($session->data['ip']) && $session->data['ip'] != $_SERVER['REMOTE_ADDR']))
{
$session->destroy();
$session->send();
readfile('html/login.html');
} else {
readfile('html/admin.html');
}

?>

Klady a zápory

Je třeba si uvědomit, že při použití této samonosné cookie, je třeba všechna session uložit a odeslat browseru ještě před prvním výstupem. Klasické PHP session tímto neduhem netrpí, neboť data jsou uložena na straně serveru. Výhodou použití této implementace je tedy čistota na straně serveru. Uživatel má veškerá data uložena u sebe na straně browseru. To sebou nese jistá omezení. Vedle ukládání dat do session je to i velikost. I když jsou data komprimována, stále jsou posílána browseru v hlavičce odpovědi. Výhodou je samozřejmě to, že programátor má daleko větší kontrolu nad tímto odesíláním.

PoorSession je tedy vhodné nasadit tam, kde se v session nalézá jen malé množství neměnných dat. Kód prezentuji pod BSD licencí, takže případné podědění třídy a vytvoření session s libovolným jiným back-endem, je snadné a licenčně možné. Do uživatelských dat stačí jen přidat unikátně vygenerovaný identifikátor svázaný s úložištěm. Session pak mohou být uložené v souboru na disku, memcachi nebo nějaké databázi.
Author:

Discussion

Your comment:

© 2019 Ondřej Tůma McBig. Ondřej Tůma | Based on: Morias | Twitter: mcbig_cz | RSS: articles, twitter