Pentest R89: Provider-Adressfelder härten

R89.1 MEDIUM + R89.2 LOW: sanitizeNotes(…, 500) macht silent
slice(0, 500) statt 400, und stripHtml lief vor dem Length-
Check – `<script>…</script>` reduzierte auf "" → null in DB
→ vorheriger Wert silent überschrieben (R87.1-Pattern auf
Adress-Feldern).

Fix: validateProviderAddress() in sanitize.ts – Raw-Input,
max 500 mit ApiError(400), Blacklist <, >, Tab + alle
Control-Chars außer \n. CRLF → LF VOR dem Length-Check, damit
Editoren mit \r\n-Line-Endings nicht doppelt zählen. Eingehängt
in stripProviderStrings für contactAddress/cancellationAddress.

R89.3/R89.4 (Quotes/\n) bewusst akzeptiert – Pentester selbst
sagt "kein Risiko", sind in Adressen legitim.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-06-21 13:35:56 +02:00
parent 8b10316683
commit f02824fe7d
4 changed files with 111 additions and 3 deletions
+16
View File
@@ -97,6 +97,22 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
## ✅ Erledigt
- [x] **🔒 Pentest R89 Provider-Adressfelder härten**
- R89.1 (MEDIUM): `sanitizeNotes(…, 500)` macht silent `slice(0, 500)`
statt 400 501+ Zeichen wurden auf 500 abgeschnitten und mit
200 OK gespeichert.
- R89.2 (LOW): `stripHtml` lief vor dem Length-Check `<script>…</script>`
reduzierte auf leeren String → `null` in der DB → vorheriger Wert
silent überschrieben (R87.1-Pattern auf Adress-Feldern).
- Fix: eigener `validateProviderAddress()` in `sanitize.ts`. Raw-Input,
max 500 → `ApiError(400)`, Blacklist `<`, `>`, Tab, alle Control-
Chars außer `\n`. CRLF → LF normalisiert vor Length-Check.
Eingehängt in `stripProviderStrings`.
- R89.3 (Quotes) + R89.4 (`\n`): bewusst nicht gefixt Pentester
bestätigt "kein unmittelbares Risiko", React escaped korrekt,
sind legitime Bestandteile mehrzeiliger Postadressen.
- Doku in `SECURITY-HARDENING.md § Runde 89`.
- [x] **🆕 Anbieter: Kontakt + Kündigung als Stammdaten**
- Sieben neue optionale Felder am `Provider`-Modell: `contactEmail`,
`contactPhone`, `contactFax`, `contactAddress`, `cancellationEmail`,