prepare("SELECT id, passwort, email FROM intern_users WHERE email = :email LIMIT 1"); $stmt->execute(['email' => $_POST['email']]); $user = $stmt->fetch(PDO::FETCH_ASSOC); if ($user && password_verify($_POST['passwort'], $user['passwort'])) { session_regenerate_id(true); $_SESSION['2fa_userid'] = (int)$user['id']; // Alten Code löschen $pdo->prepare("DELETE FROM intern_2fa_codes WHERE user_id = :uid") ->execute(['uid' => $user['id']]); // 2FA-Code $code = random_int(100000, 999999); $codeHash = hash('sha256', (string)$code); $pdo->prepare(" -- Ablaufzeit bewusst per NOW() in SQL berechnen: Webserver und -- DB-Server stehen bei verschiedenen Anbietern und koennen -- unterschiedliche Zeitzonen haben. verify_2fa.php prueft -- ebenfalls gegen NOW(), damit beide dieselbe Uhr benutzen. INSERT INTO intern_2fa_codes (user_id, code, expires_at) VALUES (:uid, :code, DATE_ADD(NOW(), INTERVAL 5 MINUTE)) ")->execute([ 'uid' => $user['id'], 'code' => $codeHash ]); SendMailMessageSilent( $con, $user['email'], 'Ihr Login-Code für Praxis-Creutzburg.de', "Ihr 2FA-Code lautet: $code

Geben Sie diesen Code niemals weiter." ); header('Location: verify_2fa.php'); exit; } $error_msg = "E-Mail oder Passwort war ungültig"; } $email_value = isset($_POST['email']) ? htmlentities($_POST['email']) : ""; include("templates/header.inc.php"); ?>