Sicherheit im CMF
Sicherheit ist keine optionale Zutat. Das CMF implementiert mehrere Schutzebenen, die out of the box funktionieren – von der Passwortspeicherung bis zum atomischen Dateischreiben. Kein Plugin nötig, kein Security-Header manuell setzen, keine Datenbank absichern.
Die sechs Sicherheitsebenen
1. Passwörter
Passwörter werden mit bcrypt gehasht – dem aktuellen Standard für Passwort-Hashing. Selbst bei einem Datenleck sind die Klartext-Passwörter nicht rekonstruierbar.
Beim Login wird password_verify() verwendet – zeitkonstanter Vergleich, immun gegen Timing-Angriffe. Der Benutzername wird mit hash_equals() verglichen.
2. API-Tokens
API-Tokens werden als SHA-256-Hash gespeichert. Der Klartext wird nur einmal beim Erstellen angezeigt – danach existiert er nirgends im System.
Bei jedem API-Request wird der mitgesendete Token gehasht und mit dem gespeicherten Hash verglichen. Kein Klartext-Vergleich, kein Timing-Leak.
3. Brute-Force-Schutz
Fehlgeschlagene Login-Versuche werden pro IP gezählt. Die Wartezeit steigt exponentiell: 5 Sekunden, 15, 30, 60 – bis maximal 1 Stunde.
Der Schutz ist dateibasiert (login_attempts.json), braucht keinen Redis oder Memcached. Nach erfolgreichen Login wird der Zähler zurückgesetzt.
4. CSRF-Schutz
Jede POST-Aktion im Backend erfordert einen CSRF-Token. Der Token wird pro Session generiert und in jedem Formular als Hidden-Field mitgesendet.
Ohne gültigen Token wird die Aktion abgelehnt. Das schützt vor Cross-Site-Request-Forgery – ein Angreifer kann keine Aktionen im Namen des eingeloggten Benutzers auslösen.
5. HTML-Sanitizing
Text-Blöcke werden beim Rendern durch den Sanitizer geschickt. Er entfernt:
- Event-Handler –
onclick,onerroretc. - Gefährliche URLs –
javascript:unddata:in href/src - Style-Attribute – verhindert CSS-Expressions
- Unerlaubte Tags – nur 15 sichere Tags bleiben
Der html-Block wird bewusst nicht sanitized – er ist für vertrauenswürdige Autoren gedacht.
6. Atomisches Schreiben
JSON-Dateien werden nie direkt überschrieben. Stattdessen: in eine temporäre Datei schreiben, dann per rename() atomar ersetzen.
Dazwischen LOCK_EX für exklusiven Dateizugriff. Wenn der Strom ausfällt oder der Prozess abbricht, bleibt die alte Datei intakt. Kein halbbeschriebenes JSON, kein Datenverlust.
Dateisystem-Architektur
Ordnerstruktur
Sensible Dateien liegen außerhalb des öffentlichen Verzeichnisses:
config/users.json– Benutzer und Token-Hashesconfig/site.json– Seitenkonfigurationconfig/styles.json– Design-Tokensapp/– gesamter PHP-Code
Nur public/ ist per Web erreichbar. Direkte Zugriffe auf PHP-Dateien außerhalb des Einstiegspunkts werden per .htaccess blockiert.
.htaccess-Schutz
Die .htaccess konfiguriert:
- URL-Rewriting – alle Requests gehen durch
index.php - GZIP-Kompression – für CSS, JS und HTML
- Browser-Caching – statische Dateien werden gecacht
- Direktzugriff blockiert – keine .json, .env oder .php Dateien direkt aufrufbar
Kein manuelles Einrichten nötig – die Datei ist im System enthalten und funktioniert auf Apache-Webservern sofort.
Sicherheit ohne Datenbank
Was wegfällt
Keine Datenbank bedeutet auch: keine datenbankspezifischen Angriffsvektoren.
- Keine SQL-Injection – es gibt kein SQL
- Kein DB-Passwort – keine Zugangsdaten die leaken können
- Keine offenen Ports – kein MySQL-Server der erreichbar sein muss
- Keine DB-Backups vergessen – es gibt nur Dateien
Was bleibt
Auch ohne Datenbank gibt es Angriffsflächen. Das CMF adressiert sie alle:
- XSS → HTML-Sanitizing in Text-Blöcken,
htmlspecialchars()überall - CSRF → Token-basierter Schutz für alle POST-Aktionen
- Brute-Force → Exponentielle Wartezeit pro IP
- Session-Hijacking → ID-Regenerierung nach Login
- Path-Traversal → Keine User-Inputs in Dateipfaden
Was der Betreiber beachten sollte
Pflicht
- Document Root auf public/ setzen
- Standard-Passwort sofort ändern
- HTTPS verwenden
- PHP und Webserver aktuell halten
Empfohlen
- API-Tokens nur an vertrauenswürdige Systeme
- Eigenen Benutzer für Automatisierung anlegen
- Regelmäßige Backups per Export
- Token regelmäßig erneuern
Optional
- Admin-Bereich per IP einschränken
- Additional Security Headers setzen
- Rate-Limiting auf Webserver-Ebene
- Monitoring für Dateiänderungen
Sicherheit ist kein Feature das man einschaltet – sie ist das Ergebnis vieler kleiner Entscheidungen in die gleiche Richtung.