From e5fd47ecf6cbb8178bbccf6d843807170a3af368 Mon Sep 17 00:00:00 2001 From: Clemens Creutzburg Date: Sun, 12 Jul 2026 09:45:35 +0200 Subject: [PATCH] =?UTF-8?q?CSRF-Schutz=20f=C3=BCr=20letzte=20Eintr=C3=A4ge?= =?UTF-8?q?=20erg=C3=A4nzen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Löschaktionen in letzteneintraege.php mit CSRF-Token absichern - POST ohne Token für Einzahlungen und Strich-Einträge blockieren - M2- und Sicherheitsdokumentation zum CSRF-Rollout aktualisieren --- docs/m0/security-baseline.md | 2 +- docs/m2-technical-foundation.md | 14 ++++++++------ docs/saas-umstrukturierungsplan.md | 3 ++- letzteneintraege.php | 5 ++++- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/docs/m0/security-baseline.md b/docs/m0/security-baseline.md index 3faf2f1..a8a5be2 100644 --- a/docs/m0/security-baseline.md +++ b/docs/m0/security-baseline.md @@ -11,7 +11,7 @@ Testing, markiert aber die wichtigsten Risiken fuer die SaaS-Umstrukturierung. | --- | --- | --- | --- | | 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 Rollenpruefung | `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` abgesichert | Ungewollte Buchungen, Loeschungen, Imports | CSRF fuer alle verbleibenden schreibenden Aktionen | +| 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` abgesichert | Ungewollte Buchungen, Loeschungen, Imports | CSRF fuer alle verbleibenden schreibenden Aktionen | | Harte Deletes fuer Buchungen | `letzteneintraege.php` | Audit-Historie und Revisionsfaehigkeit gehen verloren | Storno-/Reversal-Modell statt Delete | | Upload in Webroot | `csvupload.php` Zeilen 131-138 | Dateiablage kann missbraucht werden | Upload ausserhalb Webroot, Dateityp/MIME/Name pruefen | | Kein Tenant-Scope | alle fachlichen Queries | Zentrales SaaS-Leak-Risiko | `tenant_id` verpflichtend und Query-Schicht testen | diff --git a/docs/m2-technical-foundation.md b/docs/m2-technical-foundation.md index 16bd2fc..0b50919 100644 --- a/docs/m2-technical-foundation.md +++ b/docs/m2-technical-foundation.md @@ -47,10 +47,10 @@ Erste Legacy-POST-Seiten sind opt-in abgesichert: - `index.php`: eigene Web-Striche eintragen. - `stricheintragen.php`: Sammelerfassung von Strichen. - `einzahlung.php`: Sammelerfassung von Einzahlungen. +- `letzteneintraege.php`: letzte Einzahlungen und Strich-Eintraege loeschen. Noch offen: -- Korrektur-/Loeschflows: `letzteneintraege.php`. - Uploads: `csvupload.php`. - Spezialprozesse: `mailversenden.php`, `jahresauswertung.php`. @@ -111,6 +111,10 @@ Die Skripte erwarten die bekannten Dev-Umgebungsvariablen `DB_HOST`, `DB_NAME`, - CSRF positive Tests fuer Buchungsflows: gueltige Token funktionieren fuer eigene Web-Striche, Sammelstriche und Sammeleinzahlungen. Die temporaeren Testbuchungen wurden wieder entfernt. +- CSRF negative Tests fuer Korrektur-/Loeschflows: `letzteneintraege.php` + liefert bei POST ohne Token HTTP 419. +- CSRF positive Tests fuer Korrektur-/Loeschflows: gueltige Token funktionieren + fuer das Loeschen temporaerer Einzahlungs- und Strich-Testeintraege. - Golden Master weiterhin gruen mit 104 Assertions. - HTTP-Smoke weiterhin gruen mit 14 sicheren Seiten. @@ -124,10 +128,8 @@ Die Skripte erwarten die bekannten Dev-Umgebungsvariablen `DB_HOST`, `DB_NAME`, ## Naechste Schritte -1. Korrektur- und Loesch-POST-Seiten einzeln mit `app_csrf_field()` und - `app_require_csrf()` absichern. -2. CSV-Upload gesondert absichern und spaeter Uploads ausserhalb des Webroots +1. CSV-Upload gesondert absichern und spaeter Uploads ausserhalb des Webroots verlegen. -3. Eine duenne View-/Layout-Struktur vorbereiten, ohne Header/Footer-Markup +2. Eine duenne View-/Layout-Struktur vorbereiten, ohne Header/Footer-Markup sofort zu verschieben. -4. Danach M3 starten: Tenants, User, Registrierung, Login und Rollen. +3. Danach M3 starten: Tenants, User, Registrierung, Login und Rollen. diff --git a/docs/saas-umstrukturierungsplan.md b/docs/saas-umstrukturierungsplan.md index 94f575f..16a3cc3 100644 --- a/docs/saas-umstrukturierungsplan.md +++ b/docs/saas-umstrukturierungsplan.md @@ -383,7 +383,8 @@ Schritte: - CSRF- und Session-Basis einziehen. Session und CSRF-Helper sind vorhanden; globale Erzwingung erfolgt schrittweise pro POST-Seite. Erste Seiten sind abgesichert: `hinweise.php`, `mitarbeiterverwalten.php`, - `namenanpassen.php`, `index.php`, `stricheintragen.php`, `einzahlung.php`. + `namenanpassen.php`, `index.php`, `stricheintragen.php`, `einzahlung.php`, + `letzteneintraege.php`. - Konfigurationswerte aus Code in Umgebung oder Settings verschieben. Ergebnis: diff --git a/letzteneintraege.php b/letzteneintraege.php index f75b27a..5e7082a 100644 --- a/letzteneintraege.php +++ b/letzteneintraege.php @@ -1,6 +1,7 @@ "; echo ""; echo ""; + echo app_csrf_field(); echo ""; echo ""; echo ""; @@ -211,6 +213,7 @@ $stmtStriche = sqlsrv_query($conn, $sqlStriche); echo "
"; echo ""; echo ""; + echo app_csrf_field(); echo ""; echo "
"; echo ""; @@ -235,4 +238,4 @@ $stmtStriche = sqlsrv_query($conn, $sqlStriche); - \ No newline at end of file +