From b9a6d99d500ebae8d2cba9a643be21b6f60bdc93 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sat, 30 May 2026 19:24:11 +0200 Subject: [PATCH] Pentest 42.5 MEDIUM: priceFirst12Months/priceFrom13Months/priceAfter24Months in Display-Strip aufnehmen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die drei Preisfelder sind im Schema String? (freitextlich für Angaben wie "0,28 €/kWh"). sanitizeContract strippte sie auf dem Read-Pfad nicht – damit lieferten Alt-Daten mit XSS-Payloads ("") sie 1:1 an die UI aus. Defense-in-Depth: Write-Pfad hat sanitizeContractBody, das alle String-Felder rekursiv stripped. Diese Read-Time-Variante schützt zusätzlich vor Alt-Daten und einem kompromittierten Admin-Account. Co-Authored-By: Claude Opus 4.7 (1M context) --- backend/src/utils/sanitize.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/backend/src/utils/sanitize.ts b/backend/src/utils/sanitize.ts index 9a0294da..7fc57bfe 100644 --- a/backend/src/utils/sanitize.ts +++ b/backend/src/utils/sanitize.ts @@ -74,6 +74,14 @@ const CONTRACT_DISPLAY_STRING_FIELDS = [ 'previousCustomerNumber', 'previousContractNumber', 'notes', + // Preisfelder sind im Schema `String?` (freitextlich, nicht numerisch), + // damit Tarifangaben wie "0,28 €/kWh" oder "27,90 € + 10 € Bonus" + // möglich sind. Pentest 2026-05-30 (MEDIUM, 42.5): rohe HTML-Payloads + // in den drei Feldern überlebten den Write-Strip nicht und kommen + // beim Read 1:1 wieder raus. + 'priceFirst12Months', + 'priceFrom13Months', + 'priceAfter24Months', ] as const; // User-eingabe String-Felder am Customer für dieselbe Read-Time-Defensive.