Table of Contents
- Sicherheits-Dokumentation
- Übersicht
- Implementierte Sicherheitsmaßnahmen
- 1. Authentifizierung
- 2. CSRF-Schutz
- 3. SQL-Injection-Schutz
- 4. Input-Validierung
- 5. HTTP-Security-Headers
- 6. Datei-Zugriffsschutz
- 6.1 Cron-Skripte: nur CLI
- 7. Duplikat-Prüfung
- Best Practices
- Offene Sicherheitsaufgaben
- Sicherheits-Checkliste
- Incident Response
- Weitere Ressourcen
Sicherheits-Dokumentation
Übersicht
Dieses Dokument beschreibt die implementierten Sicherheitsmaßnahmen und Best Practices für das System.
Implementierte Sicherheitsmaßnahmen
1. Authentifizierung
Session-basierte Authentifizierung:
- PHP Sessions für Admin-Login
- Session-Regenerierung nach Login (
session_regenerate_id()) - Zentrales Session-Setup über
SessionService - Automatische sichere Cookie-Flags (HttpOnly, Secure, SameSite)
- Strict Mode aktiviert
Passwort-Hashing:
- Bcrypt über
password_hash() - Passwort in Datenbank gehasht
- Kein Passwort im Klartext im Repo/Wiki dokumentieren; Passwort-Hash wird über
adminPasswordHashverwaltet
Rate-Limiting:
- Max. 5 Fehlversuche für Admin-Login (implementiert in
AuthService) - Block: 10 Minuten
- Zusätzliches Rate-Limiting für spezifische Aktionen über
RateLimitService(z.B. Passwort-Reset: 10 Minuten Cooldown)
2. CSRF-Schutz
Token-basiert:
- Token in Session gespeichert
- 32 Bytes zufällige Hex-String
- Prüfung bei allen POST-Requests
Token-Rotation:
- Token wird nach erfolgreichen Aktionen rotiert
- Implementiert in
CSRFService
Verwendung:
// Token generieren
$token = CSRFService::getToken();
// Token prüfen
CSRFService::checkToken($_POST['csrf_token'] ?? null);
3. SQL-Injection-Schutz
Prepared Statements:
- Alle Datenbank-Queries verwenden Prepared Statements
- Keine String-Konkatenation für SQL
Beispiel:
$stmt = $pdo->prepare("SELECT * FROM registrations WHERE id = :id");
$stmt->execute([':id' => $id]);
4. Input-Validierung
Server-seitig:
- Alle Eingaben werden validiert
- Typ-Prüfung (z.B. E-Mail, Datum)
- Längen-Prüfung
Client-seitig:
- HTML5-Validierung im Frontend
- Zusätzliche JavaScript-Validierung (optional)
Beispiele:
// E-Mail
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException('Ungültige E-Mail');
}
// Datum
if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $date)) {
throw new InvalidArgumentException('Ungültiges Datum');
}
5. HTTP-Security-Headers
Implementiert in Admin-Bereich:
header('X-Frame-Options: SAMEORIGIN');
header('X-Content-Type-Options: nosniff');
header('Referrer-Policy: strict-origin-when-cross-origin');
header("Content-Security-Policy: default-src 'self'; style-src 'self' 'unsafe-inline';");
Erklärung:
X-Frame-Options: Verhindert ClickjackingX-Content-Type-Options: Verhindert MIME-SniffingReferrer-Policy: Kontrolliert Referrer-InformationenContent-Security-Policy: Beschränkt Ressourcen-Laden
6. Datei-Zugriffsschutz
.htaccess für Datenbank:
<FilesMatch "\.(db|sqlite3?|dat|log)$">
Require all denied
</FilesMatch>
Verzeichnis-Schutz:
public/data/: Nur für PHP-Zugriff.htaccessverhindert direkten Browser-Zugriff
6.1 Cron-Skripte: nur CLI
Das Mail-Queue Cron-Skript ist absichtlich nicht per Web erreichbar:
- Entry-Point:
public/backend/cron/send_mail_queue.php - Im Code wird Web-Zugriff über
PHP_SAPI !== 'cli'geblockt.
Siehe auch: Mail-Queue
7. Duplikat-Prüfung
Anmeldungen:
- Prüfung auf identische Kerndaten
- Verhindert Doppelanmeldungen
- Implementiert in
RegistrationRepository::existsDuplicateRegistration()
Best Practices
Passwörter
-
Starkes Passwort verwenden:
- Mindestens 12 Zeichen
- Groß- und Kleinbuchstaben
- Zahlen und Sonderzeichen
-
Passwort regelmäßig ändern
-
Initiales Passwort sofort ändern (oder per Reset-Funktion im Login neu setzen)
Sessions
-
Session-Timeout konfigurieren (php.ini):
session.gc_maxlifetime = 3600 -
Sichere Cookie-Flags:
- Werden automatisch durch
SessionServicegesetzt - HttpOnly: Aktiviert
- Secure: Automatisch bei HTTPS
- SameSite: Lax (Standard)
- Strict Mode: Aktiviert
- Werden automatisch durch
-
Verwendung:
SessionService::start(); // Muss vor session_start() aufgerufen werden
Fehlerbehandlung
- Keine sensiblen Daten in Fehlermeldungen
- Error-Logging aktivieren
- Display-Errors in Produktion deaktivieren:
ini_set('display_errors', '0'); error_reporting(E_ALL);
Mail-Sicherheit (Header-Injection)
Der Mailversand schützt Header-Felder vor CR/LF-Injection und encoded Betreffzeilen RFC-konform:
- Implementierung:
zgb-backend/Service/MailService.php
Logging
Admin-Aktionen protokollieren:
$logMsg = date('c') . " | Admin " . ($_SESSION['is_admin'] ?? 'unknown') .
" hat die Konfiguration geändert. IP: " . ($_SERVER['REMOTE_ADDR'] ?? '-') . "\n";
file_put_contents(__DIR__ . '/../../data/admin_actions.log', $logMsg, FILE_APPEND);
Offene Sicherheitsaufgaben
Empfohlene Verbesserungen
-
.htaccess für Backend-Verzeichnis:
<Directory "backend"> Options -Indexes AllowOverride None </Directory> -
Session-Sicherheit prüfen:
- Cookie-Flags konfigurieren
- Timeout-Einstellungen
-
Rate-Limiting erweitern:
- IP-basiertes Rate-Limiting
- Separate Limits für verschiedene Endpoints
-
Error-Logging verbessern:
- Strukturiertes Logging
- Log-Rotation
-
Backup-Sicherheit:
- Verschlüsselte Backups
- Sichere Backup-Speicherung
Sicherheits-Checkliste
Vor Deployment
- Admin-Passwort gesetzt/geändert (kein Default in Doku verwenden)
- Error-Display deaktiviert
- .htaccess konfiguriert
- Session-Einstellungen geprüft
- Datenbank-Berechtigungen gesetzt
- Backup-Strategie implementiert
Regelmäßige Wartung
- Passwort regelmäßig ändern
- Logs prüfen
- Backups testen
- Sicherheits-Updates einspielen
- Zugriffe überwachen
Incident Response
Bei Sicherheitsvorfall
- System isolieren (falls nötig)
- Logs analysieren
- Passwörter ändern
- Betroffene Daten prüfen
- Vulnerability beheben
- System wiederherstellen
Kontakt
Bei Sicherheitsproblemen:
- Admin-Bereich prüfen
- Logs analysieren
- System-Administrator kontaktieren
Weitere Ressourcen
Einstieg
Architektur
- Architektur-Übersicht
- Frontend-Build
- Backend
- Datenbank
- Mail-Queue
- Performance & Optimierungen
- Entscheidungen & Historie
Betrieb
Projektarbeit
- Code:
ssh://forgejo@home.schumbi.de/ralf/zgb_www.git - Wiki:
ssh://forgejo@home.schumbi.de/ralf/zgb_www.wiki.git