Sicherheits-/Korrektheits-Fixes und neue Funktionen
Bugfixes aus dem Code-Review: - XSS: unescaptes $_SERVER['PHP_SELF'] in csvupload.php und letzteneintraege.php durch feste Seitennamen ersetzt. - Stripe-Webhook: Event-Deduplizierung (neue Tabelle stripe_webhook_events) gegen doppelte Verarbeitung/Dolibarr-Rechnungen bei Retry-Zustellung. - Stripe-Webhook: Tarifwechsel aus dem Kundenportal wird lokal nachgezogen (plan_code aus dem Preis-lookup_key bei subscription.updated). - Post-Redirect-Get fuer jahresauswertung, mailversenden und die Selbst-Stricheintragung - verhindert Doppelbuchung/Doppelversand per Browser-Refresh. - Jahresbonus: Mails erst nach erfolgreichem Commit; Restcent-Ausgleich beim letzten Empfaenger, damit die Summe exakt stimmt. - Verschachtelte HTML-Dokumente in csvupload/einzahlung/stricheintragen entfernt (Layout kommt aus header.php). - Rate-Limit fuer den Versand von E-Mail-Verifizierungslinks. Neue Funktionen: - Mitglieder koennen ihren zuletzt selbst eingetragenen Strich wieder stornieren (nur eigene Web-Eintraege, Kassenwart-Eintraege bleiben). - Monatsuebersicht des eigenen Verbrauchs im Mitglieder-Dashboard. - Automatische Zahlungserinnerung: opt-in pro Mandant ab der Warnschwelle, mit Intervall; Cron-Skript scripts/send-payment-reminders.php. - CSV-Import fuer Mitgliederlisten inkl. herunterladbarer Vorlage (mitglieder-vorlage.php), Semikolon-/Komma- und BOM-Erkennung. - Logo als PDF-Wasserzeichen pro Mandant (Upload in den Mandant- Einstellungen, geschuetzt unter var/tenant_logos/, ersetzt den Text-Wasserzeichen im Ausdruck). Robusterer Teilnehmer-Lookup im Dashboard ueber user_id (Fallback E-Mail).
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
|
||||
require_once __DIR__ . '/functions.php';
|
||||
require_once __DIR__ . '/app/saas-mail.php';
|
||||
require_once __DIR__ . '/app/rate-limit.php';
|
||||
|
||||
$pdo = app_db_pdo();
|
||||
$user = saas_require_login();
|
||||
@@ -11,7 +12,17 @@ $verificationLink = null;
|
||||
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
app_require_csrf();
|
||||
$result = saas_request_email_verification($pdo, (int)$user['user_id'], (int)$user['tenant_id']);
|
||||
|
||||
// Begrenzt den Versand von Verifizierungsmails pro Konto und IP, damit ein
|
||||
// eingeloggter Nutzer den Mailversand nicht durch wiederholtes Absenden
|
||||
// missbrauchen kann.
|
||||
$userBucketOk = app_rate_limit_check($pdo, 'emailverify_user:' . (int)$user['user_id'], 5, 3600);
|
||||
$ipBucketOk = app_rate_limit_check($pdo, 'emailverify_ip:' . app_client_ip(), 10, 3600);
|
||||
|
||||
if (!$userBucketOk || !$ipBucketOk) {
|
||||
$errors[] = 'Es wurden bereits mehrere Verifizierungslinks angefordert. Bitte prüfe dein Postfach und versuche es später erneut.';
|
||||
} else {
|
||||
$result = saas_request_email_verification($pdo, (int)$user['user_id'], (int)$user['tenant_id']);
|
||||
|
||||
if ($result['ok']) {
|
||||
if (!empty($result['already_verified'])) {
|
||||
@@ -28,6 +39,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
} else {
|
||||
$errors = $result['errors'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
include 'header.php';
|
||||
|
||||
Reference in New Issue
Block a user