4.1 KiB
4.1 KiB
M0 Sicherheitsbaseline
Stand: 2026-07-11
Diese Baseline ist eine statische Erstbewertung. Sie ersetzt kein Penetration Testing, markiert aber die wichtigsten Risiken für die SaaS-Umstrukturierung.
Kritische Sofortthemen
| Risiko | Quelle | Auswirkung | Empfehlung |
|---|---|---|---|
| Hart codierte DB-Zugangsdaten | jahresauswertung.php Zeilen 4-8 |
Secret-Leak, direkte Produktiv-DB-Gefahr | Zugangsdaten rotieren, Skript deaktivieren oder auf Env-Konfiguration umstellen |
| Schreibende Seiten ohne eigene Rollenprüfung | stricheintragen.php, einzahlung.php, mailversenden.php, exportKaffeeliste.php |
Direkter URL-Aufruf kann Aktionen erlauben | Jede Seite serverseitig mit requireRole absichern |
| CSRF-Schutz nur teilweise vorhanden | viele POST-/Delete-Formulare; M2 hat hinweise.php, mitarbeiterverwalten.php, namenanpassen.php, index.php, stricheintragen.php, einzahlung.php, letzteneintraege.php, csvupload.php abgesichert |
Ungewollte Buchungen, Löschungen, Imports | CSRF für alle verbleibenden schreibenden Aktionen |
| Harte Deletes für Buchungen | letzteneintraege.php |
Audit-Historie und Revisionsfähigkeit gehen verloren | Storno-/Reversal-Modell statt Delete |
| CSV-Upload nur teilweise gehärtet | csvupload.php; M2 speichert temporär unter var/uploads, prüft Dateityp und löscht nach Import |
Ohne Importvorschau/Audit bleiben Fehlimporte schwer nachvollziehbar | Importvorschau, Batch-/Audit-Log und detaillierte Zeilenfehler in M6 |
| Kein Tenant-Scope | alle fachlichen Queries | Zentrales SaaS-Leak-Risiko | tenant_id verpflichtend und Query-Schicht testen |
Weitere Befunde
| Befund | Quelle | Empfehlung |
|---|---|---|
| Direkte SQL-String-Verkettung mit Mailadresse | functions.php Zeilen 14, 25, 39, 55 |
Parameterisierte Queries |
| LDAP-Filter ohne Escaping | functionsLDAP.php LDAP-Suchen nach samaccountname |
LDAP-Filter escapen |
Datumsformat Y-d-m H:i:s |
index.php, stricheintragen.php, einzahlung.php, hinweise.php |
ISO/DB-kompatibel Y-m-d H:i:s oder DB-Zeit verwenden |
| Ausgabe von Namen/E-Mails teils unescaped | mehrere Tabellen, z.B. Mitgliederverwaltung | htmlspecialchars zentral erzwingen |
Fehlerausgabe mit sqlsrv_errors() an Nutzer |
mehrere Dateien | Logging intern, neutrale Fehlermeldung extern |
| CSV-Mitarbeitersuche mit mutmaßlich falscher Parameteranzahl | csvupload.php getMitarbeiterID; in M2 korrigiert |
Mit Golden-Master weiter prüfen |
| Basis-Auth-Beispiel mit Platzhalter-Passwort | umfrageergebnisse.php Kommentarblock |
Entfernen oder echte Auth-Middleware nutzen |
App-Navigation ist in footer.php |
Layoutstruktur | Trennung in App-Shell und Public-Shell |
headerline.php enthält NUL-Zeichen |
headerline.php |
Datei prüfen/entfernen, wenn ungenutzt |
| Massenmail ohne Versandlog | mailversenden.php, jahresauswertung.php |
Job-Modell mit Dry-Run, Audit, Rate-Limit |
Rollen- und Zugriffsrisiken
Aktuell gilt:
- Sichtbare Admin-Navigation wird in
footer.phppercheckKaffeelisteAdmingesteuert. - Einige Admin-Zielseiten haben eigene Checks.
- Einige schreibende oder sensible Dateien verlassen sich nicht durchgehend auf eine eigene Rollenprüfung.
Für SaaS gilt:
- Menü-Ausblendung ist keine Berechtigungsprüfung.
- Jede Route braucht serverseitige Auth- und Rollenprüfung.
- Jede fachliche Route braucht Tenant-Kontext.
- IDs aus Requests müssen zum aktuellen Tenant gehören.
Empfohlene Reihenfolge für Sicherheitsarbeit
- Secrets rotieren und aus dem Code entfernen.
- Legacy-Schreibseiten bis zum Umbau hinter explizite Admin-Prüfung setzen.
- CSRF-Schutz schrittweise auf alle verbleibenden Legacy-Schreibseiten ausrollen.
- Finanzdaten im Zielmodell nur noch stornieren, nicht löschen.
- CSV-Import mit Vorschau, Audit und Zeilenfehlern modellieren.
- Einheitliche Escape-/View-Helfer einführen.
- Tenant-Isolation mit Tests gegen zwei Tenants absichern.
Nicht im Repo speichern
- Produktivpasswörter.
- Echte Nutzerlisten.
- Bank-/PayPal-Exportdaten mit Personenbezug.
- AD-/LDAP-Service-Account-Daten.
- Vollständige Produktiv-Dumps.