From 39921938a6a32d1beef948266ca185abcf69b72b Mon Sep 17 00:00:00 2001 From: Ivan Pomykacz Date: Wed, 5 Mar 2025 08:19:51 +0100 Subject: [PATCH] chore: readme update --- README.md | 76 +++++++++++++++++++++++++++++++++++++++- content.php | 14 ++++++++ docs/client-cookies.png | Bin 0 -> 39153 bytes docs/server-session.png | Bin 0 -> 4753 bytes index.php | 34 ++++++++++++++++++ login.php | 11 ++++++ login_form.php | 5 +++ 7 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 content.php create mode 100644 docs/client-cookies.png create mode 100644 docs/server-session.png create mode 100644 index.php create mode 100644 login.php create mode 100644 login_form.php 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 0000000000000000000000000000000000000000..8e1465cd52c8d84b99d8e2fa449d1ac57ddf8f60 GIT binary patch literal 39153 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 W;W+b*i*?{Hh{fe=mr70VKKU0SIL}!C literal 0 HcmV?d00001 diff --git a/docs/server-session.png b/docs/server-session.png new file mode 100644 index 0000000000000000000000000000000000000000..62b7895d8fa1fda6f89edc8a56f5dc72fd889758 GIT binary patch literal 4753 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 literal 0 HcmV?d00001 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 @@ + + + + +