6 Sicherheit
Ralf Warmuth edited this page 2026-01-10 23:58:44 +01:00

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 adminPasswordHash verwaltet

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 Clickjacking
  • X-Content-Type-Options: Verhindert MIME-Sniffing
  • Referrer-Policy: Kontrolliert Referrer-Informationen
  • Content-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
  • .htaccess verhindert 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

  1. Starkes Passwort verwenden:

    • Mindestens 12 Zeichen
    • Groß- und Kleinbuchstaben
    • Zahlen und Sonderzeichen
  2. Passwort regelmäßig ändern

  3. Initiales Passwort sofort ändern (oder per Reset-Funktion im Login neu setzen)

Sessions

  1. Session-Timeout konfigurieren (php.ini):

    session.gc_maxlifetime = 3600
    
  2. Sichere Cookie-Flags:

    • Werden automatisch durch SessionService gesetzt
    • HttpOnly: Aktiviert
    • Secure: Automatisch bei HTTPS
    • SameSite: Lax (Standard)
    • Strict Mode: Aktiviert
  3. Verwendung:

    SessionService::start(); // Muss vor session_start() aufgerufen werden
    

Fehlerbehandlung

  1. Keine sensiblen Daten in Fehlermeldungen
  2. Error-Logging aktivieren
  3. 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

  1. .htaccess für Backend-Verzeichnis:

    <Directory "backend">
        Options -Indexes
        AllowOverride None
    </Directory>
    
  2. Session-Sicherheit prüfen:

    • Cookie-Flags konfigurieren
    • Timeout-Einstellungen
  3. Rate-Limiting erweitern:

    • IP-basiertes Rate-Limiting
    • Separate Limits für verschiedene Endpoints
  4. Error-Logging verbessern:

    • Strukturiertes Logging
    • Log-Rotation
  5. 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

  1. System isolieren (falls nötig)
  2. Logs analysieren
  3. Passwörter ändern
  4. Betroffene Daten prüfen
  5. Vulnerability beheben
  6. System wiederherstellen

Kontakt

Bei Sicherheitsproblemen:

  • Admin-Bereich prüfen
  • Logs analysieren
  • System-Administrator kontaktieren

Weitere Ressourcen