Files

146 lines
6.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Systém přihlašování MSPPPPaM dokumentace pro implementaci
Tento dokument popisuje hotový systém přihlašování v PHP a MySQL,
který chci použít v novém projektu. Systém je připravený, neupravuj
jeho soubory pouze ho používej.
---
## Umístění souborů
Všechny soubory systému jsou ve složce `auth/` v kořenovém adresáři projektu.
---
## Seznam souborů a jejich funkce
| Soubor | Popis |
|---|---|
| `auth/config.php` | Veškerá konfigurace systému (DB přihlašovací údaje, URL, limity, přepínače). Upravuje se při nasazení. |
| `auth/db.php` | Připojení k MySQL přes PDO. Výsledkem je proměnná `$pdo`. |
| `auth/auth.php` | Hlavní soubor vkládá se na začátek chráněných stránek. Ověří přihlášení a nastaví proměnné (viz níže). |
| `auth/login.php` | Přihlašovací stránka s formulářem. Obsahuje ochranu proti brute force a CSRF. |
| `auth/logout.php` | Odhlášení zruší session i remember me cookie. Přesměruje na login. |
| `auth/registrace.php` | Registrace nového uživatele (pokud je povolena v config.php). |
| `auth/reset_hesla.php` | Formulář pro zaslání odkazu na obnovu hesla emailem. |
| `auth/nove_heslo.php` | Stránka z odkazu v emailu umožní zadat nové heslo. |
| `auth/admin.php` | Administrační rozhraní správa uživatelů, zobrazení konfigurace, test emailu. Přístupné pouze adminům. |
| `auth/mail.php` | Pomocná funkce `odesli_mail()` pro odesílání emailů přes PHP `mail()`. |
| `auth/install.php` | Jednorázový instalační skript vytvoří tabulky v DB a prvního admina. Po instalaci zablokován souborem `install.lock`. |
| `auth/js/heslo-sila.js` | JavaScript pro kontrolu síly hesla pomocí knihovny zxcvbn (Dropbox). Používají ho stránky s formuláři pro zadání hesla. |
---
## Jak použít systém na chráněné stránce
Na začátek každého PHP souboru, jehož obsah chci chránit, vložím:
```php
require_once 'auth/auth.php';
```
Po načtení jsou k dispozici tyto proměnné:
| Proměnná | Typ | Popis |
|---|---|---|
| `$auth_prihlasen` | `bool` | `true` pokud je uživatel přihlášen, jinak `false`. Nastaveno vždy. |
| `$auth_uzivatel['id']` | `int\|null` | ID přihlášeného uživatele, nebo `null` pokud není přihlášen. |
| `$auth_uzivatel['email']` | `string\|null` | Email přihlášeného uživatele, nebo `null`. |
| `$auth_uzivatel['admin']` | `bool` | `true` pokud je přihlášený uživatel admin, jinak `false`. Nastaveno vždy. |
| `$auth_logout_html` | `string` | Připravený HTML kód s emailem uživatele, tlačítkem odhlášení a (pro adminy) odkazem na administraci. Neprázdný pouze pokud je uživatel přihlášen. Použití: `echo $auth_logout_html;` |
| `$auth_login_html` | `string` | Připravený HTML formulář pro přihlášení (email, heslo, zapamatovat si mě, CSRF token). Neprázdný pouze pokud uživatel NENÍ přihlášen. Odesílá data na `login.php`, které po přihlášení přesměruje zpět na aktuální stránku. Použití: `echo $auth_login_html;` |
### Dva režimy fungování (nastavení v `auth/config.php`)
**`VYZADOVAT_PRIHLASENI = true`** (výchozí):
Nepřihlášený uživatel je automaticky přesměrován na přihlašovací stránku.
Na chráněnou stránku se dostane až po přihlášení.
**`VYZADOVAT_PRIHLASENI = false`**:
Stránka se zobrazí všem. Pomocí `$auth_prihlasen` si stránka sama
rozhodne, co nepřihlášenému uživateli ukáže.
---
## Databázové tabulky
Systém přihlašování vytváří a spravuje tyto tabulky:
### `auth_users` uživatelé přihlašovacího systému
| Sloupec | Typ | Popis |
|---|---|---|
| `id` | `INT UNSIGNED` | Primární klíč, auto increment |
| `email` | `VARCHAR(255)` | Email uživatele, unikátní |
| `heslo` | `VARCHAR(255)` | Bcrypt hash hesla |
| `admin` | `TINYINT(1)` | 0 = běžný uživatel, 1 = admin |
| `vytvoreno` | `DATETIME` | Datum a čas registrace |
### `auth_remember_tokens` tokeny pro "zapamatovat si mě"
Spravuje systém přihlašování automaticky. Není potřeba upravovat.
### `auth_brute_force` záznamy neúspěšných přihlášení
Spravuje systém přihlašování automaticky. Není potřeba upravovat.
### `auth_password_resets` tokeny pro obnovu hesla
Spravuje systém přihlašování automaticky. Není potřeba upravovat.
### `users` uživatelé konkrétní služby
Tato tabulka propojuje systém přihlašování s tvým projektem.
Systém přihlašování ji vytvoří při instalaci se základní strukturou:
| Sloupec | Typ | Popis |
|---|---|---|
| `id` | `INT UNSIGNED` | Primární klíč, auto increment |
| `uzivatel_id` | `INT UNSIGNED` | Cizí klíč na `auth_users.id` (ON DELETE CASCADE) |
**Tuto tabulku rozšíříš o vlastní sloupce** podle potřeb projektu
(jméno, telefon, nastavení, apod.). Systém přihlašování ji nebude
nijak měnit pouze při registraci nového uživatele do ní vloží
prázdný řádek s `uzivatel_id`.
Propojení s uživatelem přihlašovacího systému:
```sql
SELECT u.*, au.email
FROM users u
JOIN auth_users au ON au.id = u.uzivatel_id
WHERE u.uzivatel_id = :id
```
---
## Konfigurace (auth/config.php)
Při nasazení do projektu je potřeba vyplnit:
- `DB_HOST`, `DB_NAME`, `DB_USER`, `DB_PASS` přihlašovací údaje k MySQL
- `PROJEKT_NAZEV` název projektu (zobrazuje se na přihlašovací stránce)
- `PROJEKT_URL` základní URL webu (používá se v odkazech v emailech)
- `MAIL_ODESILATEL` emailová adresa odesílatele (musí být autorizována SPF záznamem domény)
- `MAIL_TEST_ADRESA` adresa pro testovací email v admin rozhraní
- `REGISTRACE_OTEVRENA` `true` = veřejná registrace, `false` = pouze admin zakládá uživatele
- `VYZADOVAT_PRIHLASENI` `true` = přesměrovat nepřihlášené, `false` = stránka rozhoduje sama
Cesty ke stránkám auth systému (pokud je složka `auth/` jinde než v kořeni webu):
- `AUTH_LOGIN_URL`, `AUTH_LOGOUT_URL`, `AUTH_ADMIN_URL`
- `AUTH_REGISTRACE_URL`, `AUTH_RESET_URL`
- `AUTH_REDIRECT_PO_PRIHLASENI` kam přesměrovat po přihlášení
---
## Bezpečnostní vlastnosti systému
Pro přehled systém řeší:
- Hesla hashována bcryptem (`password_hash` s `PASSWORD_DEFAULT`)
- Ochrana před SQL injection výhradně PDO prepared statements
- Ochrana před CSRF každý formulář obsahuje token ověřovaný na serveru
- Ochrana před brute force blokování po opakovaných neúspěšných pokusech
- Ochrana před session fixation `session_regenerate_id()` při přihlášení
- Ochrana před XSS `htmlspecialchars()` na všech výstupech
- Remember me bezpečný selector+token mechanismus (heslo ani ID není v cookie)
- Síla hesla kontrola přes zxcvbn (JavaScript) + minimální délka (PHP)
- Celá DB v `utf8mb4` plná podpora diakritiky a emoji