Files
2026-10-19 18:05:51 +00:00

71 lines
3.1 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
require_once __DIR__ . '/includes/bootstrap.php';
if (current_user()) {
redirect('/home.php');
}
$errors = [];
$sent = false;
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
verify_csrf();
$email = trim($_POST['email'] ?? '');
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors[] = 'Bitte geben Sie eine gültige E-Mail-Adresse an.';
} elseif (!rate_limit_check('password_reset_request', client_ip(), 3, 15)) {
$errors[] = 'Zu viele Anfragen. Bitte versuchen Sie es in einigen Minuten erneut.';
} elseif (!rate_limit_check('password_reset_request_email', $email, 2, 60)) {
// Gleiche Fehlermeldung – verrät nicht ob die E-Mail bekannt ist
$errors[] = 'Zu viele Anfragen. Bitte versuchen Sie es in einigen Minuten erneut.';
} else {
$stmt = get_db()->prepare('SELECT * FROM users WHERE LOWER(email) = LOWER(?)');
$stmt->execute([$email]);
$user = $stmt->fetch();
// Immer dieselbe Erfolgsmeldung anzeigen, unabhängig davon, ob das Konto existiert
// (verhindert, dass Angreifer registrierte E-Mail-Adressen erraten können).
if ($user) {
$token = create_password_reset('customer', $email);
$link = base_url() . '/reset_password.php?token=' . urlencode($token);
email_send_and_log($email, 'Passwort zurücksetzen', email_password_reset_body($link), null, 'Passwort-zurücksetzen-Mail (Kunde)');
}
$sent = true;
}
}
$pageTitle = 'Passwort vergessen';
$activePage = 'login';
require __DIR__ . '/includes/header_customer.php';
?>
<style>.page-content{padding:0!important;margin:0!important}</style>
</div><!-- page-content -->
<?php $__banner = get_setting('banner_path'); ?>
<div class="auth-wrap<?= $__banner ? ' has-image' : '' ?>"<?= $__banner ? ' style="background-image:url(' . e($__banner) . ')"' : '' ?>>
<div class="auth-card">
<?php require __DIR__ . '/includes/brand_block.php'; ?>
<h1>Passwort vergessen</h1>
<div class="sub">Wir senden Ihnen einen Link zum Zurücksetzen.</div>
<?php foreach ($errors as $err): ?>
<div class="flash error"><?= e($err) ?></div>
<?php endforeach; ?>
<?php if ($sent): ?>
<div class="flash success">Falls ein Konto mit dieser E-Mail-Adresse existiert, wurde soeben ein Link zum Zurücksetzen versendet.</div>
<p style="margin-top:18px;font-size:.85rem"><a href="/login.php">← Zur Anmeldung</a></p>
<?php else: ?>
<form method="post">
<?= csrf_field() ?>
<label for="email">E-Mail-Adresse</label>
<input type="email" id="email" name="email" required autofocus autocapitalize="none" autocorrect="off" spellcheck="false">
<div class="btn-row">
<button type="submit" class="btn" style="width:100%">Link anfordern</button>
</div>
</form>
<p style="margin-top:18px;font-size:.85rem"><a href="/login.php">← Zur Anmeldung</a></p>
<?php endif; ?>
</div>
</div>
<footer class="public-footer">Copyright &copy; <?= date('Y') ?> <?= e(get_setting('display_name', config()['site']['name'])) ?> &ndash; Alle Rechte vorbehalten.</footer>