
7 changed files with 139 additions and 1 deletions
@ -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. |
||||
|
|
||||
|
 |
||||
|
|
||||
|
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. |
||||
|
|
||||
|
 |
||||
|
|
||||
|
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? |
||||
|
|
||||
|
@ -0,0 +1,14 @@ |
|||||
|
<?php |
||||
|
|
||||
|
if (!isset($user_is_logged) || !$user_is_logged) { |
||||
|
die('Přístup zamítnut'); |
||||
|
// or do something else, like redirect to login page: |
||||
|
// header('Location: /index.php'); |
||||
|
// exit(); |
||||
|
} |
||||
|
|
||||
|
?> |
||||
|
|
||||
|
<p> |
||||
|
Tento obsah je dostupný pouze pro přihlášené uživatele. |
||||
|
</p> |
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 4.6 KiB |
@ -0,0 +1,34 @@ |
|||||
|
<?php |
||||
|
|
||||
|
session_start(); |
||||
|
|
||||
|
$user_is_logged = false; |
||||
|
|
||||
|
if (isset($_SESSION['login'])) { |
||||
|
$user_is_logged = true; |
||||
|
} |
||||
|
|
||||
|
?> |
||||
|
<!DOCTYPE html> |
||||
|
<html lang="cs"> |
||||
|
|
||||
|
<head> |
||||
|
<meta charset="UTF-8"> |
||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
||||
|
<title>PHP Sessions</title> |
||||
|
</head> |
||||
|
|
||||
|
<body> |
||||
|
|
||||
|
<?php |
||||
|
if ($user_is_logged) { |
||||
|
include 'content.php'; |
||||
|
} |
||||
|
else { |
||||
|
include 'login_form.php'; |
||||
|
} |
||||
|
?> |
||||
|
|
||||
|
</body> |
||||
|
|
||||
|
</html> |
@ -0,0 +1,11 @@ |
|||||
|
<?php |
||||
|
|
||||
|
session_start(); |
||||
|
|
||||
|
if ($_POST["login"] == "admin" && $_POST["password"] == "heslo") { |
||||
|
$_SESSION["login"] = $_POST["login"]; |
||||
|
} else { |
||||
|
session_destroy(); |
||||
|
} |
||||
|
|
||||
|
header("Location: /index.php"); |
@ -0,0 +1,5 @@ |
|||||
|
<form name="login" action="/login.php" method="post"> |
||||
|
<input type="text" name="login" placeholder="Login"> |
||||
|
<input type="password" name="password" placeholder="Heslo"> |
||||
|
<button type="submit">Přihlásit</button> |
||||
|
</form> |
Loading…
Reference in new issue