[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:
+8
-72
@@ -2,11 +2,6 @@
|
||||
// ============================================================
|
||||
// OBNOVA HESLA – KROK 2
|
||||
// ============================================================
|
||||
// Na tuto stránku přichází uživatel z odkazu v emailu.
|
||||
// Odkaz obsahuje ID záznamu a plaintext token.
|
||||
//
|
||||
// Stránka ověří platnost tokenu a umožní nastavit nové heslo.
|
||||
// ============================================================
|
||||
|
||||
require_once __DIR__ . '/config.php';
|
||||
require_once __DIR__ . '/db.php';
|
||||
@@ -21,7 +16,6 @@ session_set_cookie_params([
|
||||
]);
|
||||
session_start();
|
||||
|
||||
// Pokud je uživatel přihlášen, přesměrujeme ho
|
||||
if (isset($_SESSION['uzivatel_id'])) {
|
||||
header('Location: ' . AUTH_REDIRECT_PO_PRIHLASENI);
|
||||
exit;
|
||||
@@ -40,16 +34,15 @@ $csrf_token = $_SESSION['csrf_token'];
|
||||
// OVĚŘENÍ ODKAZU (parametry z URL)
|
||||
// ------------------------------------------------------------
|
||||
|
||||
$token_ok = false; // true pokud je token platný
|
||||
$zaznam_id = 0; // ID záznamu v auth_password_resets
|
||||
$uzivatel_id = 0; // ID uživatele
|
||||
$token_ok = false;
|
||||
$zaznam_id = 0;
|
||||
$uzivatel_id = 0;
|
||||
|
||||
$id_z_url = $_GET['id'] ?? '';
|
||||
$token_z_url = $_GET['token'] ?? '';
|
||||
|
||||
if (!empty($id_z_url) && !empty($token_z_url)) {
|
||||
|
||||
// Vyhledáme záznam podle ID
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT `id`, `uzivatel_id`, `token_hash`, `expiruje`
|
||||
FROM `" . DB_TABULKA_RESET . "`
|
||||
@@ -60,12 +53,7 @@ if (!empty($id_z_url) && !empty($token_z_url)) {
|
||||
$zaznam = $stmt->fetch();
|
||||
|
||||
if ($zaznam) {
|
||||
|
||||
// Zkontrolujeme expiraci
|
||||
if (time() < strtotime($zaznam['expiruje'])) {
|
||||
|
||||
// Ověříme token (password_verify = konstantní čas,
|
||||
// ochrana před timing útoky)
|
||||
if (password_verify($token_z_url, $zaznam['token_hash'])) {
|
||||
$token_ok = true;
|
||||
$zaznam_id = $zaznam['id'];
|
||||
@@ -76,7 +64,7 @@ if (!empty($id_z_url) && !empty($token_z_url)) {
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------
|
||||
// ZPRACOVÁNÍ FORMULÁŘE (nastavení nového hesla)
|
||||
// ZPRACOVÁNÍ FORMULÁŘE
|
||||
// ------------------------------------------------------------
|
||||
|
||||
$chyba = '';
|
||||
@@ -84,7 +72,6 @@ $uspech = false;
|
||||
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST' && $token_ok) {
|
||||
|
||||
// -- 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.';
|
||||
@@ -95,7 +82,6 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && $token_ok) {
|
||||
$heslo = $_POST['heslo'] ?? '';
|
||||
$heslo2 = $_POST['heslo2'] ?? '';
|
||||
|
||||
// Validace hesla
|
||||
if (empty($heslo)) {
|
||||
$chyba = 'Heslo nesmí být prázdné.';
|
||||
} elseif (mb_strlen($heslo) < HESLO_MIN_DELKA) {
|
||||
@@ -108,11 +94,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && $token_ok) {
|
||||
if (empty($chyba)) {
|
||||
|
||||
try {
|
||||
|
||||
// Zahashujeme nové heslo
|
||||
$heslo_hash = password_hash($heslo, PASSWORD_DEFAULT);
|
||||
|
||||
// Aktualizujeme heslo uživatele v DB
|
||||
$stmt = $pdo->prepare("
|
||||
UPDATE `" . DB_TABULKA_UZIVATELE . "`
|
||||
SET `heslo` = :heslo
|
||||
@@ -123,15 +106,12 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && $token_ok) {
|
||||
':id' => $uzivatel_id,
|
||||
]);
|
||||
|
||||
// Smažeme použitý reset token – je jednorázový
|
||||
$stmt2 = $pdo->prepare("
|
||||
DELETE FROM `" . DB_TABULKA_RESET . "`
|
||||
WHERE `id` = :id
|
||||
");
|
||||
$stmt2->execute([':id' => $zaznam_id]);
|
||||
|
||||
// Smažeme všechny remember me tokeny tohoto uživatele –
|
||||
// po změně hesla jsou všechna zařízení odhlášena
|
||||
$stmt3 = $pdo->prepare("
|
||||
DELETE FROM `" . DB_TABULKA_TOKENY . "`
|
||||
WHERE `uzivatel_id` = :uzivatel_id
|
||||
@@ -174,16 +154,11 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && $token_ok) {
|
||||
|
||||
<?php elseif (!$token_ok): ?>
|
||||
|
||||
<!-- Token je neplatný nebo vypršel -->
|
||||
<p><strong>Tento odkaz pro obnovu hesla je neplatný nebo vypršel.</strong></p>
|
||||
<p>Požádej o
|
||||
<a href="<?php echo htmlspecialchars(dirname($_SERVER['PHP_SELF'])); ?>/reset_hesla.php">
|
||||
nový odkaz pro obnovu hesla</a>.</p>
|
||||
<p>Požádej o <a href="<?php echo htmlspecialchars(AUTH_RESET_URL); ?>">nový odkaz pro obnovu hesla</a>.</p>
|
||||
|
||||
<?php else: ?>
|
||||
|
||||
<!-- Token je platný – zobrazíme formulář -->
|
||||
|
||||
<?php if (!empty($chyba)): ?>
|
||||
<p><strong>Chyba: <?php echo htmlspecialchars($chyba); ?></strong></p>
|
||||
<?php endif; ?>
|
||||
@@ -231,49 +206,10 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && $token_ok) {
|
||||
|
||||
<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');
|
||||
|
||||
// Prvky existují jen pokud je zobrazen formulář
|
||||
// (ne při úspěchu nebo neplatném tokenu)
|
||||
if (inputHeslo) {
|
||||
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)';
|
||||
}
|
||||
});
|
||||
}
|
||||
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