Files

6.8 KiB
Raw Permalink Blame History

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:

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:

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