[ui] Extrahována kontrola síly hesla do samostatného JS souboru, přidána kontrola minimální délky
[ui] registrace.php – použit společný JS pro kontrolu hesla [ui] nove_heslo.php – použit společný JS pro kontrolu hesla, opraven odkaz na reset [ui] admin.php – použit společný JS pro kontrolu hesla [FÁZE-1][install] Vícekrokový průběh instalace, použit společný JS pro kontrolu hesla
This commit is contained in:
+7
-72
@@ -2,15 +2,10 @@
|
||||
// ============================================================
|
||||
// REGISTRACE NOVÉHO UŽIVATELE
|
||||
// ============================================================
|
||||
// Tento soubor je dostupný pouze pokud je v config.php
|
||||
// nastaveno REGISTRACE_OTEVRENA = true.
|
||||
// Jinak registraci provádí pouze admin přes admin.php.
|
||||
// ============================================================
|
||||
|
||||
require_once __DIR__ . '/config.php';
|
||||
require_once __DIR__ . '/db.php';
|
||||
|
||||
// Spuštění session (stejné nastavení jako v auth.php)
|
||||
session_name(SESSION_NAZEV);
|
||||
session_set_cookie_params([
|
||||
'lifetime' => 0,
|
||||
@@ -26,8 +21,6 @@ session_start();
|
||||
// ------------------------------------------------------------
|
||||
|
||||
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('<!DOCTYPE html><html lang="cs"><head><meta charset="UTF-8"><title>Registrace</title></head><body><p>Registrace nových uživatelů není momentálně dostupná.</p><p><a href="' . htmlspecialchars(AUTH_LOGIN_URL) . '">Zpět na přihlášení</a></p></body></html>');
|
||||
}
|
||||
|
||||
@@ -50,13 +43,12 @@ $csrf_token = $_SESSION['csrf_token'];
|
||||
// ZPRACOVÁNÍ FORMULÁŘE
|
||||
// ------------------------------------------------------------
|
||||
|
||||
$chyba = '';
|
||||
$uspech = false;
|
||||
$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.';
|
||||
@@ -64,14 +56,12 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
|
||||
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)) {
|
||||
@@ -81,7 +71,6 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
|
||||
if (empty($chyba)) {
|
||||
|
||||
// -- Validace hesla -----------------------------------
|
||||
if (empty($heslo)) {
|
||||
$chyba = 'Heslo nesmí být prázdné.';
|
||||
} elseif (mb_strlen($heslo) < HESLO_MIN_DELKA) {
|
||||
@@ -93,37 +82,22 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
|
||||
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) {
|
||||
if ($stmt->fetch()['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`)
|
||||
@@ -137,8 +111,6 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
|
||||
$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 . "`
|
||||
@@ -189,7 +161,6 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
|
||||
<form method="POST" action="">
|
||||
|
||||
<!-- CSRF token -->
|
||||
<input type="hidden" name="csrf_token" value="<?php echo htmlspecialchars($csrf_token); ?>">
|
||||
|
||||
<p>
|
||||
@@ -214,7 +185,6 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
autocomplete="new-password"
|
||||
>
|
||||
<br>
|
||||
<!-- Indikátor síly hesla – vyplní ho zxcvbn přes JavaScript -->
|
||||
<span id="heslo-sila">Síla hesla: zadej heslo</span>
|
||||
</p>
|
||||
|
||||
@@ -230,7 +200,6 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<!-- Tlačítko je zakázané dokud heslo nedosáhne požadované síly -->
|
||||
<button type="submit" id="tlacitko-odeslat" disabled>
|
||||
Zaregistrovat se
|
||||
</button>
|
||||
@@ -245,45 +214,11 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/zxcvbn/4.4.2/zxcvbn.js"></script>
|
||||
<script>
|
||||
const MIN_SILA = <?php echo (int) HESLO_MIN_SILA; ?>;
|
||||
|
||||
const POPISKY_SILY = [
|
||||
'Velmi slabé',
|
||||
'Slabé',
|
||||
'Průměrné',
|
||||
'Silné',
|
||||
'Velmi silné'
|
||||
];
|
||||
|
||||
const inputHeslo = document.getElementById('heslo');
|
||||
const spanSila = document.getElementById('heslo-sila');
|
||||
const tlacitko = document.getElementById('tlacitko-odeslat');
|
||||
const spanDuvod = document.getElementById('tlacitko-duvod');
|
||||
|
||||
inputHeslo.addEventListener('input', function () {
|
||||
const hodnota = this.value;
|
||||
|
||||
if (hodnota.length === 0) {
|
||||
spanSila.textContent = 'Síla hesla: zadej heslo';
|
||||
tlacitko.disabled = true;
|
||||
spanDuvod.textContent = ' (čekám na dostatečně silné heslo)';
|
||||
return;
|
||||
}
|
||||
|
||||
const vysledek = zxcvbn(hodnota);
|
||||
const skore = vysledek.score;
|
||||
|
||||
spanSila.textContent = 'Síla hesla: ' + POPISKY_SILY[skore] + ' (' + skore + '/4)';
|
||||
|
||||
if (skore >= MIN_SILA) {
|
||||
tlacitko.disabled = false;
|
||||
spanDuvod.textContent = '';
|
||||
} else {
|
||||
tlacitko.disabled = true;
|
||||
spanDuvod.textContent = ' (heslo je příliš slabé, potřebuji alespoň ' + MIN_SILA + '/4)';
|
||||
}
|
||||
});
|
||||
// Předáme PHP konstanty do JavaScriptu
|
||||
var AUTH_HESLO_MIN_SILA = <?php echo (int) HESLO_MIN_SILA; ?>;
|
||||
var AUTH_HESLO_MIN_DELKA = <?php echo (int) HESLO_MIN_DELKA; ?>;
|
||||
</script>
|
||||
<script src="<?php echo htmlspecialchars(PROJEKT_URL); ?>/auth/js/heslo-sila.js"></script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user