diff --git a/README.md b/README.md index 8184e55..9830b08 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,76 @@ -# sessions +# PHP sessions + +Princip SESSIONS spočívá v použití _cookies_ na straně uživatele (prohlížeče) a speciáního souboru na straně serveru. + +Při opakované návštěvě stránek prohlížeč odešle společně s požadavkem na stránku i _cookie_ vázané ke stejné doméně. Server se pak podívá mezi soubory, zdali tam není takový, který by nesl stejný identifikátor, jako je uložený v _cookie_. + +To znamená, že prohlížeč si pamatuje, že jste na stránce byli, a pokud tu informaci pošle serveru, tak si vzpomene i server a dojde k navázání sezení, které proběhlo v minulosti. + +Proč _cookies_ vůbec vznikly? + +Ukázalo se praktické pro server/vývojáře vědět, zdali ten, kdo se z prohlížeče dívá na stránku `http://localhost:8080/auto.php` je táž osoba, která zrovna klikla na `http://localhost:8080/motorka.php`. + +- Jak je vidět, je to stejný server/doména `localhost`. +- Ovšem jiná URL (stránka) (`auto.php` nebo `motorka.php`) +- Díky session můžeme poznat, že jde o stejného uživatele + +A proč to vývojář tak potřebuje vědět? + +Předtím, než cookies znásilnily reklamní systémy a jiné marketingové nástroje to mělo, a tedy stále má (to jsou ty tzv. _funkční_ cookies, které nejde "vypnout") funkci např. pamatovat si zdali je uživatel přihlášený a podle toho mu nabídnout obsah, který s tím souvisí. + +## Implementace + +Chceme-li použít sessions, je třeba v každém skriptu, který se volá přes URL (např. [index.php](./index.php) nebo [login.php](./login.php)) zavolat funkci `session_start()`. + +Všimněte si, že např. v souboru [content.php](./content.php) zmíněná funkce není. To proto, že se tento souboru vkládá pomocí `include` v souboru `index.php` (nepřistupuje se k němu přímo z URL). + +Jakmile zavoláme funkci `session_start()`, máme dostupnou super globální proměnnou `$_SESSION`. A můžeme např. zjistit, zdali je uživatel přihlášený. + +```php +if (isset($_SESSION['login'])) { + $user_is_logged = true; +} +``` + +Pozor ovšem, `$_SESSION['login']` je námi vytvořená hodnota, ovšem v tomto textu je popsaná o pár odstavců dál. + +Jak si můžete všimnout ve skriptu `index.php`, využíváme pak novou proměnnou `$user_is_logged` pro rozhodování, jaký obsah uživateli zobrazíme - zdali formulář nebo obsah dostupný pouze pro přihlášeného uživatele. + +### Ukázka využití - přihlášení + +Není-li uživatel přihlášený, zobrazí se mu formulář. +Po jeho odeslální dojde k ověření (autentizaci) ve skriptu [login.php](./login.php). + +Ignorujme pro teď fakt, že jsme se dopustili fatálního přešlapu tím, že jsme přihlašovací údaje vložili přímo do skriptu. + +Nicméně, bude-li autentizace úspěšná, uloží se přihlásovací jméno do session. + +```php +$_SESSION["login"] = $_POST["login"]; +``` + +Následně se provede přesměrování zpět na výchozí stránku. + +```php +header("Location: /index.php"); +``` + +### Cookies + +Podíváte-li se do "Developer console" (F12), uvidíte mezi "Cookies" navštívenou stránku. + +![Cookies](./docs/client-cookies.png) + +Cookie nese název `PHPSESSID` + +Poměrně zásadní fakt je, že cookie nese pouze hodnotu nějakého identifikátoru, zde `32965ff632572288af24f0f007393efa`. Nic víc. + + +Na serveru se pak vytvořil soubor `sess_32965ff632572288af24f0f007393efa`, který má v názvu týž identifikátor. + +![Session file](./docs/server-session.png) + +Důležité je, že identifikátor zná pouze klient (prohlížeč) a server. Ideálně nikdo další není zainteresován. + +A ano, pokud někdo zjistí např. tuto hodnotu `32965ff632572288af24f0f007393efa`, tak jeho šance na získání vašeho sezení se astronomicky zvýšily. Otázkou pak je, k čemu ten identifikátor byl ... e-shop? sociální síť? banka? diff --git a/content.php b/content.php new file mode 100644 index 0000000..eee7f55 --- /dev/null +++ b/content.php @@ -0,0 +1,14 @@ + + +

+ Tento obsah je dostupný pouze pro přihlášené uživatele. +

diff --git a/docs/client-cookies.png b/docs/client-cookies.png new file mode 100644 index 0000000..8e1465c Binary files /dev/null and b/docs/client-cookies.png differ diff --git a/docs/server-session.png b/docs/server-session.png new file mode 100644 index 0000000..62b7895 Binary files /dev/null and b/docs/server-session.png differ diff --git a/index.php b/index.php new file mode 100644 index 0000000..0b0c060 --- /dev/null +++ b/index.php @@ -0,0 +1,34 @@ + + + + + + + + PHP Sessions + + + + + + + + + diff --git a/login.php b/login.php new file mode 100644 index 0000000..d0bb2a1 --- /dev/null +++ b/login.php @@ -0,0 +1,11 @@ + + + + +