CSRF zweite Anpassung

This commit is contained in:
2026-07-12 09:01:42 +02:00
parent 444f0a269b
commit 981c770ce5
6 changed files with 18 additions and 6 deletions
+1 -1
View File
@@ -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` 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` 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 |
+9 -2
View File
@@ -44,10 +44,12 @@ Erste Legacy-POST-Seiten sind opt-in abgesichert:
- `mitarbeiterverwalten.php`: Mitglied anlegen, Bearbeitungsformular oeffnen, - `mitarbeiterverwalten.php`: Mitglied anlegen, Bearbeitungsformular oeffnen,
Mitglied speichern, aktivieren und deaktivieren. Mitglied speichern, aktivieren und deaktivieren.
- `namenanpassen.php`: Anzeigenamen aktualisieren. - `namenanpassen.php`: Anzeigenamen aktualisieren.
- `index.php`: eigene Web-Striche eintragen.
- `stricheintragen.php`: Sammelerfassung von Strichen.
- `einzahlung.php`: Sammelerfassung von Einzahlungen.
Noch offen: Noch offen:
- Buchungsflows: `index.php`, `stricheintragen.php`, `einzahlung.php`.
- Korrektur-/Loeschflows: `letzteneintraege.php`. - Korrektur-/Loeschflows: `letzteneintraege.php`.
- Uploads: `csvupload.php`. - Uploads: `csvupload.php`.
- Spezialprozesse: `mailversenden.php`, `jahresauswertung.php`. - Spezialprozesse: `mailversenden.php`, `jahresauswertung.php`.
@@ -104,6 +106,11 @@ Die Skripte erwarten die bekannten Dev-Umgebungsvariablen `DB_HOST`, `DB_NAME`,
- CSRF positive Tests: gueltige Token funktionieren fuer Hinweis-Anlage, - CSRF positive Tests: gueltige Token funktionieren fuer Hinweis-Anlage,
Mitglieder-Bearbeitungsformular und Namensanpassung. Der temporaere Mitglieder-Bearbeitungsformular und Namensanpassung. Der temporaere
Testhinweis wurde wieder entfernt. Testhinweis wurde wieder entfernt.
- CSRF negative Tests fuer Buchungsflows: `index.php`, `stricheintragen.php`
und `einzahlung.php` liefern bei POST ohne Token HTTP 419.
- CSRF positive Tests fuer Buchungsflows: gueltige Token funktionieren fuer
eigene Web-Striche, Sammelstriche und Sammeleinzahlungen. Die temporaeren
Testbuchungen wurden wieder entfernt.
- 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.
@@ -117,7 +124,7 @@ Die Skripte erwarten die bekannten Dev-Umgebungsvariablen `DB_HOST`, `DB_NAME`,
## Naechste Schritte ## Naechste Schritte
1. Buchungs- und Korrektur-POST-Seiten einzeln mit `app_csrf_field()` und 1. Korrektur- und Loesch-POST-Seiten einzeln mit `app_csrf_field()` und
`app_require_csrf()` absichern. `app_require_csrf()` absichern.
2. CSV-Upload gesondert absichern und spaeter Uploads ausserhalb des Webroots 2. CSV-Upload gesondert absichern und spaeter Uploads ausserhalb des Webroots
verlegen. verlegen.
+1 -1
View File
@@ -383,7 +383,7 @@ 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`. `namenanpassen.php`, `index.php`, `stricheintragen.php`, `einzahlung.php`.
- Konfigurationswerte aus Code in Umgebung oder Settings verschieben. - Konfigurationswerte aus Code in Umgebung oder Settings verschieben.
Ergebnis: Ergebnis:
+2
View File
@@ -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";
@@ -120,6 +121,7 @@ $stmtMitarbeiter = sqlsrv_query($conn, $sqlMitarbeiter);
</li> </li>
</ul> </ul>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>"> <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>">
<?php echo app_csrf_field(); ?>
<?php <?php
echo "<table>"; echo "<table>";
+3 -2
View File
@@ -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";
@@ -151,9 +152,9 @@ if(checkKaffeelisteAccess($conn, $mailadress)){
echo'<ul class="actions"> echo'<ul class="actions">
<li>'; <li>';
echo '<form method="post" action="' . htmlspecialchars($_SERVER["PHP_SELF"]) . '"><button type="submit">Einen Strich eintragen</button><input type="hidden" name="anzahlStriche" value="1" ></form>'; echo '<form method="post" action="' . htmlspecialchars($_SERVER["PHP_SELF"]) . '"><button type="submit">Einen Strich eintragen</button><input type="hidden" name="anzahlStriche" value="1" >' . app_csrf_field() . '</form>';
echo '</li><li>'; echo '</li><li>';
echo '<form method="post" action="' . htmlspecialchars($_SERVER["PHP_SELF"]) . '"><button type="submit">Zwei Striche eintragen</button><input type="hidden" name="anzahlStriche" value="2" ></form>'; echo '<form method="post" action="' . htmlspecialchars($_SERVER["PHP_SELF"]) . '"><button type="submit">Zwei Striche eintragen</button><input type="hidden" name="anzahlStriche" value="2" >' . app_csrf_field() . '</form>';
echo '</li></ul>'; echo '</li></ul>';
if ($_SERVER["REQUEST_METHOD"] == "POST") { if ($_SERVER["REQUEST_METHOD"] == "POST") {
+2
View File
@@ -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";
@@ -122,6 +123,7 @@ $KostenproStrich = number_format($KostenproStrichtemp, 2, '.', '');
</ul> </ul>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>"> <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>">
<?php echo app_csrf_field(); ?>
<?php <?php
echo "<label for='kostenproStrich'>Kosten pro Strich:</label> echo "<label for='kostenproStrich'>Kosten pro Strich:</label>