diff --git a/auth/registrace.php b/auth/registrace.php new file mode 100644 index 0000000..0d31d2c --- /dev/null +++ b/auth/registrace.php @@ -0,0 +1,289 @@ + 0, + 'path' => '/', + 'httponly' => true, + 'samesite' => 'Strict', + // 'secure' => true, +]); +session_start(); + +// ------------------------------------------------------------ +// KONTROLA: Je registrace povolena? +// ------------------------------------------------------------ + +if (!REGISTRACE_OTEVRENA) { + // Registrace je uzavřena – zobrazíme informaci a skončíme + // Neposíláme HTTP 403, aby útočník nezjistil, že stránka existuje + die('
Registrace nových uživatelů není momentálně dostupná.
'); +} + +// Pokud je uživatel již přihlášen, přesměrujeme ho +if (isset($_SESSION['uzivatel_id'])) { + header('Location: ' . AUTH_REDIRECT_PO_PRIHLASENI); + exit; +} + +// ------------------------------------------------------------ +// CSRF TOKEN +// ------------------------------------------------------------ + +if (empty($_SESSION['csrf_token'])) { + $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); +} +$csrf_token = $_SESSION['csrf_token']; + +// ------------------------------------------------------------ +// ZPRACOVÁNÍ FORMULÁŘE +// ------------------------------------------------------------ + +$chyba = ''; +$uspech = false; +$email_hodnota = ''; + +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + + // -- Ověření CSRF tokenu ---------------------------------- + $csrf_z_formulare = $_POST['csrf_token'] ?? ''; + if (!hash_equals($csrf_token, $csrf_z_formulare)) { + $chyba = 'Neplatný požadavek. Zkuste stránku obnovit a zkusit znovu.'; + } + + if (empty($chyba)) { + + // -- Načtení hodnot z formuláře ----------------------- + $email = trim($_POST['email'] ?? ''); + $heslo = $_POST['heslo'] ?? ''; + $heslo2 = $_POST['heslo2'] ?? ''; + + $email_hodnota = htmlspecialchars($email); + + // -- 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.'; + } + } + + if (empty($chyba)) { + + // -- Validace hesla ----------------------------------- + if (empty($heslo)) { + $chyba = 'Heslo nesmí být prázdné.'; + } elseif (mb_strlen($heslo) < HESLO_MIN_DELKA) { + $chyba = 'Heslo musí mít alespoň ' . HESLO_MIN_DELKA . ' znaků.'; + } elseif ($heslo !== $heslo2) { + $chyba = 'Hesla se neshodují.'; + } + } + + if (empty($chyba)) { + + // -- Kontrola, zda email již neexistuje --------------- + // Používáme stejnou obecnou chybovou hlášku jako při + // neúspěšném přihlášení – nezveřejňujeme, které emaily + // jsou v systému registrovány (ochrana soukromí). + $stmt = $pdo->prepare(" + SELECT COUNT(*) AS pocet + FROM `" . DB_TABULKA_UZIVATELE . "` + WHERE `email` = :email + "); + $stmt->execute([':email' => $email]); + $pocet = $stmt->fetch()['pocet']; + + if ($pocet > 0) { + $chyba = 'Tento email je již registrován.'; + // Poznámka: Tato hláška záměrně říká, že email existuje. + // Pokud by ti vadilo zveřejňování existence emailů, + // změň hlášku na obecnější (např. "Registrace se nezdařila, + // zkontroluj zadané údaje."). Pro většinu projektů je ale + // přímá hláška přijatelná a uživatelsky přívětivější. + } + } + + if (empty($chyba)) { + + // -- Vše v pořádku – zaregistrujeme uživatele --------- + try { + + // Zahashujeme heslo (nikdy neukládáme plaintext!) + $heslo_hash = password_hash($heslo, PASSWORD_DEFAULT); + + // Vložíme nového uživatele do tabulky auth_users + $stmt = $pdo->prepare(" + INSERT INTO `" . DB_TABULKA_UZIVATELE . "` + (`email`, `heslo`, `admin`) + VALUES + (:email, :heslo, 0) + "); + $stmt->execute([ + ':email' => $email, + ':heslo' => $heslo_hash, + ]); + + $novy_uzivatel_id = $pdo->lastInsertId(); + + // Pokud existuje tabulka služby, vytvoříme prázdný řádek + // (ostatní data si uživatel doplní později v nastavení) + if (DB_TABULKA_SLUZBA !== '') { + $stmt2 = $pdo->prepare(" + INSERT INTO `" . DB_TABULKA_SLUZBA . "` + (`uzivatel_id`) + VALUES + (:uzivatel_id) + "); + $stmt2->execute([':uzivatel_id' => $novy_uzivatel_id]); + } + + $uspech = true; + + } catch (PDOException $e) { + error_log('Chyba při registraci: ' . $e->getMessage()); + $chyba = 'Při registraci došlo k chybě. Zkuste to prosím znovu.'; + } + } +} + +// ------------------------------------------------------------ +// HTML VÝSTUP +// ------------------------------------------------------------ +?> + + + + +Registrace proběhla úspěšně!
+Můžeš se nyní přihlásit.
+ + + + +Chyba:
+ + + + + + + + + + + + + \ No newline at end of file