From c4ec313eebaa604598e6f8df1cd5c42731a05aef Mon Sep 17 00:00:00 2001 From: stepan Date: Mon, 16 Mar 2026 23:08:28 +0100 Subject: [PATCH] =?UTF-8?q?[F=C3=81ZE-1][config]=20P=C5=99id=C3=A1n=20konf?= =?UTF-8?q?igura=C4=8Dn=C3=AD=20soubor=20syst=C3=A9mu=20p=C5=99ihla=C5=A1o?= =?UTF-8?q?v=C3=A1n=C3=AD=20[F=C3=81ZE-1][db]=20P=C5=99id=C3=A1no=20p?= =?UTF-8?q?=C5=99ipojen=C3=AD=20k=20datab=C3=A1zi=20p=C5=99es=20PDO=20[F?= =?UTF-8?q?=C3=81ZE-1][install]=20P=C5=99id=C3=A1n=20instala=C4=8Dn=C3=AD?= =?UTF-8?q?=20skript=20s=20tvorbou=20tabulek=20a=20prvn=C3=ADho=20admina?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- auth/config.php | 147 +++++++++++++++++++++ auth/db.php | 48 +++++++ auth/install.php | 323 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 518 insertions(+) create mode 100644 auth/config.php create mode 100644 auth/db.php create mode 100644 auth/install.php diff --git a/auth/config.php b/auth/config.php new file mode 100644 index 0000000..ec8be76 --- /dev/null +++ b/auth/config.php @@ -0,0 +1,147 @@ + PDO::ERRMODE_EXCEPTION, + + // Výsledky vrací jako asociativní pole (např. $radek['email']) + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + + // Vypne emulovné prepared statements – používáme pravé, + // které chrání před SQL injection na úrovni databáze + PDO::ATTR_EMULATE_PREPARES => false, +]; + +// Pokus o připojení k databázi +try { + $pdo = new PDO($dsn, DB_USER, DB_PASS, $moznosti); +} catch (PDOException $e) { + // Při chybě připojení zobrazíme obecnou chybovou hlášku. + // Detailní chybu NEZOBRAZUJEME uživateli – mohla by prozradit + // citlivé informace o struktuře serveru. + // Chybu ale zalogujeme do PHP error logu pro administrátora. + error_log('Chyba připojení k databázi: ' . $e->getMessage()); + die('Nepodařilo se připojit k databázi. Zkuste to prosím později.'); +} \ No newline at end of file diff --git a/auth/install.php b/auth/install.php new file mode 100644 index 0000000..11af156 --- /dev/null +++ b/auth/install.php @@ -0,0 +1,323 @@ +Instalace již proběhla. Pokud chceš instalaci opakovat, smaž soubor auth/install.lock. Pozor – tím přijdeš o všechna data!

'); +} + +// ------------------------------------------------------------ +// ZPRACOVÁNÍ FORMULÁŘE (pokud byl odeslán) +// ------------------------------------------------------------ + +$chyba = ''; +$uspech = false; + +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + + // Načtení hodnot z formuláře + $email = trim($_POST['email'] ?? ''); + $heslo = $_POST['heslo'] ?? ''; + $heslo2 = $_POST['heslo2'] ?? ''; + + // Základní validace emailu + if (empty($email)) { + $chyba = 'Email nesmí být prázdný.'; + } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) { + $chyba = 'Email není platná emailová adresa.'; + } + + // Validace hesla + if (empty($chyba) && empty($heslo)) { + $chyba = 'Heslo nesmí být prázdné.'; + } elseif (empty($chyba) && mb_strlen($heslo) < HESLO_MIN_DELKA) { + $chyba = 'Heslo musí mít alespoň ' . HESLO_MIN_DELKA . ' znaků.'; + } elseif (empty($chyba) && $heslo !== $heslo2) { + $chyba = 'Hesla se neshodují.'; + } + + // Pokud není chyba, spustíme instalaci + if (empty($chyba)) { + + try { + + // ------------------------------------------------ + // VYTVOŘENÍ TABULEK + // ------------------------------------------------ + + // Tabulka uživatelů přihlašovacího systému + // utf8mb4 = plná podpora Unicode (diakritika, emoji) + $pdo->exec(" + CREATE TABLE IF NOT EXISTS `" . DB_TABULKA_UZIVATELE . "` ( + `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `email` VARCHAR(255) NOT NULL, + `heslo` VARCHAR(255) NOT NULL, + `admin` TINYINT(1) NOT NULL DEFAULT 0, + `vytvoreno` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `email` (`email`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + "); + + // Tabulka remember me tokenů + // selector = veřejný identifikátor pro vyhledání záznamu v DB + // token_hash = bcrypt hash tajného tokenu (samotný token je jen v cookie) + $pdo->exec(" + CREATE TABLE IF NOT EXISTS `" . DB_TABULKA_TOKENY . "` ( + `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `uzivatel_id` INT UNSIGNED NOT NULL, + `selector` VARCHAR(32) NOT NULL, + `token_hash` VARCHAR(255) NOT NULL, + `expiruje` DATETIME NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `selector` (`selector`), + FOREIGN KEY (`uzivatel_id`) REFERENCES `" . DB_TABULKA_UZIVATELE . "` (`id`) ON DELETE CASCADE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + "); + + // Tabulka brute force záznamů + // Ukládají se neúspěšné pokusy o přihlášení + $pdo->exec(" + CREATE TABLE IF NOT EXISTS `" . DB_TABULKA_BRUTE . "` ( + `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `ip_adresa` VARCHAR(45) NOT NULL, + `email` VARCHAR(255) NOT NULL, + `cas` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `ip_adresa` (`ip_adresa`), + KEY `email` (`email`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + "); + + // Tabulka tokenů pro obnovu hesla + // Token je platný jen omezenou dobu (viz config.php) + $pdo->exec(" + CREATE TABLE IF NOT EXISTS `" . DB_TABULKA_RESET . "` ( + `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `uzivatel_id` INT UNSIGNED NOT NULL, + `token_hash` VARCHAR(255) NOT NULL, + `expiruje` DATETIME NOT NULL, + PRIMARY KEY (`id`), + FOREIGN KEY (`uzivatel_id`) REFERENCES `" . DB_TABULKA_UZIVATELE . "` (`id`) ON DELETE CASCADE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + "); + + // Tabulka uživatelů konkrétní služby (pokud je nastavena) + // Tato tabulka slouží pro data specifická pro tvůj projekt + // (jméno, nastavení, kontaktní údaje apod.) + if (DB_TABULKA_SLUZBA !== '') { + $pdo->exec(" + CREATE TABLE IF NOT EXISTS `" . DB_TABULKA_SLUZBA . "` ( + `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `uzivatel_id` INT UNSIGNED NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `uzivatel_id` (`uzivatel_id`), + FOREIGN KEY (`uzivatel_id`) REFERENCES `" . DB_TABULKA_UZIVATELE . "` (`id`) ON DELETE CASCADE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + "); + } + + // ------------------------------------------------ + // VYTVOŘENÍ PRVNÍHO ADMIN UŽIVATELE + // ------------------------------------------------ + + $heslo_hash = password_hash($heslo, PASSWORD_DEFAULT); + + $stmt = $pdo->prepare(" + INSERT INTO `" . DB_TABULKA_UZIVATELE . "` + (`email`, `heslo`, `admin`) + VALUES + (:email, :heslo, 1) + "); + $stmt->execute([ + ':email' => $email, + ':heslo' => $heslo_hash, + ]); + + $novy_uzivatel_id = $pdo->lastInsertId(); + + // Pokud existuje tabulka služby, vytvoříme prázdný řádek + if (DB_TABULKA_SLUZBA !== '') { + $stmt2 = $pdo->prepare(" + INSERT INTO `" . DB_TABULKA_SLUZBA . "` + (`uzivatel_id`) + VALUES + (:uzivatel_id) + "); + $stmt2->execute([':uzivatel_id' => $novy_uzivatel_id]); + } + + // ------------------------------------------------ + // VYTVOŘENÍ ZÁMKU – zabránění opakované instalaci + // ------------------------------------------------ + + file_put_contents($lock_soubor, 'Instalace proběhla: ' . date('Y-m-d H:i:s')); + + $uspech = true; + + } catch (PDOException $e) { + // Chybu zalogujeme, uživateli zobrazíme obecnou hlášku + error_log('Chyba při instalaci: ' . $e->getMessage()); + $chyba = 'Při instalaci došlo k chybě databáze. Zkontroluj nastavení v config.php a PHP error log.'; + } catch (Exception $e) { + error_log('Chyba při instalaci: ' . $e->getMessage()); + $chyba = 'Při instalaci došlo k neočekávané chybě.'; + } + } +} + +// ------------------------------------------------------------ +// HTML VÝSTUP +// ------------------------------------------------------------ +// Poznámka: žádné stylování – vše je záměrně prosté, +// aby žádný prvek nebyl skrytý nebo překrytý. +// ------------------------------------------------------------ +?> + + + + + Instalace – <?php echo htmlspecialchars(PROJEKT_NAZEV); ?> + + + +

Instalace systému přihlašování

+

+ + + +

Instalace proběhla úspěšně!

+

Tabulky byly vytvořeny a první administrátor byl založen.

+

Byl vytvořen soubor auth/install.lock – instalaci již nelze spustit znovu.

+

Přejít na přihlášení

+ + + +

Tento skript vytvoří potřebné tabulky v databázi a založí prvního administrátora.

+

Spusť ho pouze jednou. Po instalaci bude zablokován souborem install.lock.

+ + +

Chyba:

+ + +
+ +

+
+ +

+ +

+
+ +
+ + Síla hesla: zadej heslo +

+ +

+
+ +

+ +

+ + + (čekám na dostatečně silné heslo) +

+ +
+ + + + + + + + + \ No newline at end of file