
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