CSRF-Schutz für letzte Einträge ergänzen
- 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
This commit is contained in:
@@ -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 |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 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 |
|
| Kein Tenant-Scope | alle fachlichen Queries | Zentrales SaaS-Leak-Risiko | `tenant_id` verpflichtend und Query-Schicht testen |
|
||||||
|
|||||||
@@ -47,10 +47,10 @@ Erste Legacy-POST-Seiten sind opt-in abgesichert:
|
|||||||
- `index.php`: eigene Web-Striche eintragen.
|
- `index.php`: eigene Web-Striche eintragen.
|
||||||
- `stricheintragen.php`: Sammelerfassung von Strichen.
|
- `stricheintragen.php`: Sammelerfassung von Strichen.
|
||||||
- `einzahlung.php`: Sammelerfassung von Einzahlungen.
|
- `einzahlung.php`: Sammelerfassung von Einzahlungen.
|
||||||
|
- `letzteneintraege.php`: letzte Einzahlungen und Strich-Eintraege loeschen.
|
||||||
|
|
||||||
Noch offen:
|
Noch offen:
|
||||||
|
|
||||||
- Korrektur-/Loeschflows: `letzteneintraege.php`.
|
|
||||||
- Uploads: `csvupload.php`.
|
- Uploads: `csvupload.php`.
|
||||||
- Spezialprozesse: `mailversenden.php`, `jahresauswertung.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
|
- CSRF positive Tests fuer Buchungsflows: gueltige Token funktionieren fuer
|
||||||
eigene Web-Striche, Sammelstriche und Sammeleinzahlungen. Die temporaeren
|
eigene Web-Striche, Sammelstriche und Sammeleinzahlungen. Die temporaeren
|
||||||
Testbuchungen wurden wieder entfernt.
|
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.
|
- Golden Master weiterhin gruen mit 104 Assertions.
|
||||||
- HTTP-Smoke weiterhin gruen mit 14 sicheren Seiten.
|
- 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
|
## Naechste Schritte
|
||||||
|
|
||||||
1. Korrektur- und Loesch-POST-Seiten einzeln mit `app_csrf_field()` und
|
1. CSV-Upload gesondert absichern und spaeter Uploads ausserhalb des Webroots
|
||||||
`app_require_csrf()` absichern.
|
|
||||||
2. CSV-Upload gesondert absichern und spaeter Uploads ausserhalb des Webroots
|
|
||||||
verlegen.
|
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.
|
sofort zu verschieben.
|
||||||
4. Danach M3 starten: Tenants, User, Registrierung, Login und Rollen.
|
3. Danach M3 starten: Tenants, User, Registrierung, Login und Rollen.
|
||||||
|
|||||||
@@ -383,7 +383,8 @@ Schritte:
|
|||||||
- CSRF- und Session-Basis einziehen. Session und CSRF-Helper sind vorhanden;
|
- CSRF- und Session-Basis einziehen. Session und CSRF-Helper sind vorhanden;
|
||||||
globale Erzwingung erfolgt schrittweise pro POST-Seite. Erste Seiten sind
|
globale Erzwingung erfolgt schrittweise pro POST-Seite. Erste Seiten sind
|
||||||
abgesichert: `hinweise.php`, `mitarbeiterverwalten.php`,
|
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.
|
- Konfigurationswerte aus Code in Umgebung oder Settings verschieben.
|
||||||
|
|
||||||
Ergebnis:
|
Ergebnis:
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
include "functions.php";
|
include "functions.php";
|
||||||
|
app_require_csrf();
|
||||||
include "header.php";
|
include "header.php";
|
||||||
include "headerline.php";
|
include "headerline.php";
|
||||||
include "nav.php";
|
include "nav.php";
|
||||||
@@ -124,6 +125,7 @@ $stmtEinzahlungen = sqlsrv_query($conn, $sqlEinzahlungen);
|
|||||||
echo "<form method='post' action='{$_SERVER["PHP_SELF"]}'>";
|
echo "<form method='post' action='{$_SERVER["PHP_SELF"]}'>";
|
||||||
echo "<input type='hidden' name='aktion' value='loescheneinzahlung'>";
|
echo "<input type='hidden' name='aktion' value='loescheneinzahlung'>";
|
||||||
echo "<input type='hidden' name='einzahlungID' value='{$einzahlungID}'>";
|
echo "<input type='hidden' name='einzahlungID' value='{$einzahlungID}'>";
|
||||||
|
echo app_csrf_field();
|
||||||
echo "<button type='submit'>Löschen</button>";
|
echo "<button type='submit'>Löschen</button>";
|
||||||
echo "</form>";
|
echo "</form>";
|
||||||
echo "</td>";
|
echo "</td>";
|
||||||
@@ -211,6 +213,7 @@ $stmtStriche = sqlsrv_query($conn, $sqlStriche);
|
|||||||
echo "<form method='post' action='{$_SERVER["PHP_SELF"]}'>";
|
echo "<form method='post' action='{$_SERVER["PHP_SELF"]}'>";
|
||||||
echo "<input type='hidden' name='aktion' value='loeschen'>";
|
echo "<input type='hidden' name='aktion' value='loeschen'>";
|
||||||
echo "<input type='hidden' name='strichID' value='{$strichID}'>";
|
echo "<input type='hidden' name='strichID' value='{$strichID}'>";
|
||||||
|
echo app_csrf_field();
|
||||||
echo "<button type='submit'>Löschen</button>";
|
echo "<button type='submit'>Löschen</button>";
|
||||||
echo "</form>";
|
echo "</form>";
|
||||||
echo "</td>";
|
echo "</td>";
|
||||||
|
|||||||
Reference in New Issue
Block a user