Files
kaffeekasse-saas/landing.php
T
clemensandClaude Sonnet 5 54217d2acb M8: Security-Headers, Rate-Limits und Audit-Log
Erste drei Bausteine der Haertung:

- Security-Headers (X-Content-Type-Options, X-Frame-Options, Referrer-
  Policy, Permissions-Policy, HSTS bei HTTPS) laufen automatisch ueber
  app_send_security_headers() am Ende von app/bootstrap.php fuer jede
  dynamische Seite; landing.php war als einzige Seite ganz ohne PHP und
  bekam einen minimalen Bootstrap-Aufruf. Bewusst kein CSP, da die
  bestehenden Templates durchgaengig auf Inline-style-Attribute setzen.
- DB-gestuetzte Rate-Limits (neue Tabelle rate_limit_attempts) fuer
  Login (10/15min je E-Mail, 20/15min je IP), Registrierung (5/h je IP)
  und Passwort-Reset-Anfrage (5/h je E-Mail, 10/h je IP); bei
  ausgereiztem Reset-Limit erscheint dieselbe generische Meldung wie im
  Erfolgsfall, um kein Konto-Enumeration-Signal zu geben.
- Zentrales Audit-Log (neue Tabelle audit_log) fuer Mitgliederverwaltung,
  Zugangsvergabe/-entzug, Storno, Mandant-Einstellungen, Hinweise,
  CSV-Import, Jahresbonus-Verteilung und Live-Mailversand; sichtbar fuer
  Owner/Admin auf mandant-einstellungen.php.

Live getestet: Rate-Limit greift nach 10 Fehlversuchen, Audit-Log-Eintrag
mit korrekten Metadaten und Nutzernamen ueber einen isolierten Test-
Mandanten geprueft. Alle Regressionstests weiterhin gruen (26/26 Smoke,
104 Golden-Master-Assertions).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-15 18:04:14 +02:00

59 lines
2.7 KiB
PHP

<?php require_once __DIR__ . '/app/bootstrap.php'; ?>
<!DOCTYPE HTML>
<html lang="de">
<head>
<title>Kaffeeliste</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
<link rel="stylesheet" href="assets/css/main.css" />
<link rel="stylesheet" href="assets/css/public.css" />
</head>
<body class="is-preload public-page">
<div class="public-shell">
<section class="public-hero">
<nav class="public-nav" aria-label="Hauptnavigation">
<strong>Kaffeeliste</strong>
<ul class="actions">
<li><a href="login.php" class="button">Login</a></li>
<li><a href="register.php" class="button primary">Registrieren</a></li>
</ul>
</nav>
<div class="public-hero-content">
<h1>Kaffeeliste</h1>
<p>Die digitale Kaffeekasse für Teams, Büros und Vereine: Striche, Einzahlungen und offene Beträge bleiben nachvollziehbar an einem Ort.</p>
<ul class="actions">
<li><a href="register.php" class="button primary big">Kundenkonto anlegen</a></li>
<li><a href="login.php" class="button big">Zur App</a></li>
</ul>
</div>
</section>
<section class="public-section">
<header class="major">
<h2>Alles rund um die Kaffeekasse</h2>
</header>
<div class="public-grid">
<article class="public-feature">
<h3>Striche erfassen</h3>
<p>Teilnehmer und Admins behalten Verbrauch, Einzahlungen und Salden im Blick.</p>
</article>
<article class="public-feature">
<h3>Mandantenfähig</h3>
<p>Jeder Kunde arbeitet in seinem eigenen Bereich mit eigenen Einstellungen.</p>
</article>
<article class="public-feature">
<h3>Webspace-tauglich</h3>
<p>Der Start erfolgt über eine zentrale App-Adresse mit Login und Mandantenauswahl.</p>
</article>
</div>
</section>
</div>
<script src="assets/js/jquery.min.js"></script>
<script src="assets/js/browser.min.js"></script>
<script src="assets/js/breakpoints.min.js"></script>
<script src="assets/js/util.js"></script>
<script src="assets/js/main.js"></script>
</body>
</html>