Browse Source

chore: readme update

master
Ivan Pomykacz 2 months ago
parent
commit
39921938a6
  1. 76
      README.md
  2. 14
      content.php
  3. BIN
      docs/client-cookies.png
  4. BIN
      docs/server-session.png
  5. 34
      index.php
  6. 11
      login.php
  7. 5
      login_form.php

76
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?

14
content.php

@ -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>

BIN
docs/client-cookies.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
docs/server-session.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

34
index.php

@ -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>

11
login.php

@ -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");

5
login_form.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…
Cancel
Save