diff --git a/Changes.md b/Changes.md index 6a645c7..d042516 100644 --- a/Changes.md +++ b/Changes.md @@ -2,6 +2,13 @@ --- +## 2026-07-27 – Fix: Reflektiertes XSS über _error-Parameter bei Rechnungs-Zahlungserfassung (Issue #132) + +- `InvoiceController::book()` übernahm den Fehler-Array ungeprüft direkt aus `$_GET['_error']` und reichte ihn an die View weiter. Da `_error` nirgendwo serverseitig befüllt wird und der CSRF-Schutz nur für POST/PUT/DELETE/PATCH greift, konnte ein Angreifer per einfachem Link (`GET /invoices/{id}/book?_error[x]='; + $getBackup = $_GET; + $_GET['_error'] = ['x' => $payload]; + + try { + $controller = new \Steuerkram\Controllers\InvoiceController(); + ob_start(); + $controller->book(['id' => (string)$invoiceId]); + $html = ob_get_clean(); + } finally { + $_GET = $getBackup; + } + + $this->assert( + !str_contains($html, $payload), + 'Roher