6.8 KiB
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 MySQLPROJEKT_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živateleVYZADOVAT_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_URLAUTH_REGISTRACE_URL,AUTH_RESET_URLAUTH_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_hashsPASSWORD_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