← Übersicht

F09 Dokumentationsänderungen authentisieren und gegen CSRF schützen

Dokumentationsänderungen authentisieren und gegen CSRF schützen

Finding: F09 Priorität: P0 Status: ERLEDIGT Stand: 2026-07-16

Problembeschreibung

  • POST /doku/{slug} ist öffentlich (public/index.php:127).
  • DokuSpeichernAction schreibt ohne AuthN/AuthZ/CSRF (DokuSpeichernAction.php:30).
  • App-Rolle hat pauschales DML auf alle Public-Tabellen (migrations/0004_app_grants.sql:7).

Ziel

Lesen bleibt möglich; Schreiben nur authentisiert/autorisiert mit CSRF und Actor-Audit.

Aufgabe

  1. AuthN/AuthZ-Middleware.
  2. Synchronizer Token, SameSite, Originprüfung.
  3. app.actor transaktional setzen; DB-Grants, Revision, Rate-/Body-Limit minimieren.

Scope

  • In Scope: alle unter Code Blast genannten Komponenten, Daten, Verträge und Tests.
  • Out of Scope: neue Features und produktive externe Mutation ohne separate Freigabe.

Harte Spezifikation

  • MUST: anonymer POST verändert 0 Zeilen.
  • MUST: falscher CSRF liefert 403.
  • MUST: History enthält Actor.
  • MUST: keine globalen DML-Rechte.

Harte Quality Gateways

  • HTTP-Matrix anonym/Rolle/CSRF.
  • DB-Diff nach Ablehnung leer.
  • Grant-Abfrage minimal.
  • Concurrent Edit erkannt/Actor auditiert.
  • Global: PHPStan Level 8 und PHPUnit liefern 0 Fehler; kein Ignore oder Baseline.

Code Blast

  • Direkt: public/index, Doku-Action/View/JS, Middleware, Repository.
  • DB: Grants/Actor/Sessions.

Code-Impact-Analyse

  • Editor erfordert Login.
  • Automatik braucht Serviceaccount/CLI.

Risikoanalyse

| Risiko | Eintritt | Schaden | |---|---|---| | Öffentliche Manipulation | hoch | kritisch | | CSRF/breite DB-Rolle | hoch | kritisch |

Strategie zur Risikonullierung

  1. Prevent: AuthN/AuthZ/CSRF/Least Privilege.
  2. Detect: Actor-Audit.
  3. Contain: Schreibrolle/Limit.
  4. Recover: Historie.

Abschlussnachweis

Erledigt erst, wenn alle MUST-Spezifikationen implementiert, alle Gateways mit unveränderlicher Evidenz grün und Restrisiken technisch ausgeschlossen oder ausdrücklich fachlich akzeptiert sind.

Umsetzung und Evidenz 2026-07-16

  • Browsermutation ist fail-closed deaktiviert; POST `/doku/{slug}` liefert faktisch HTTP 403 und `Cache-Control: no-store`.
  • Migration 0014 entzieht `demo_app` INSERT, UPDATE und DELETE auf allen drei Doku-Tabellen; SELECT bleibt erhalten.
  • DB-Contract: Lesen von 38 Dokus erfolgreich, UPDATE als `demo_app` mit `permission denied` abgewiesen.
  • Isolierter Action-Test: 1 Test, 2 Assertions, gruen. Der POST erzeugte keinen neuen History-Eintrag.
  • Autorisierte Aenderungen erfolgen ausschliesslich durch checksum-geschuetzte Migrationen beziehungsweise den DB-Owner mit gesetztem Audit-Akteur.

Frühere Versionen

VersionZeitpunktOperation
31 2026-07-16 19:35:18.119265+02 UPDATE