Pentest R95: portalUsername (Manual-Modus) härten
R95.1 MEDIUM: foo\r\nBcc:evil@x.de → Header-Injection-Vektor R95.3 LOW: <script>...</script>@x.de → silent stripHtml-Mutation R95.4 LOW: >190 Zeichen → VARCHAR-Overflow → 500 statt 400 Fix: validatePortalUsername() in sanitize.ts mit Whitelist ^[A-Za-z0-9_\-/.@+ ]{0,100}$. Strukturell sind CRLF, Tab, alle Control-Chars, Tags und Quotes raus → R95.1+R95.3 ohne extra Check. Max 100 → ApiError(400) → R95.4. Raw-Input vor stripHtml geprüft (R87-Pattern). Eingehängt in sanitizeContractBody. R95.2 (Email-Format-Pflicht) bewusst NICHT übernommen: portalUsername ist im Manual-Modus nicht zwingend eine Email (Vodafone, 1&1, EWE und Stadtwerke nutzen Kundennummern oder Pseudonyme als Portal-Login). Doku in SECURITY-HARDENING.md § Runde 95. Frontend: maxLength={100} am Input als UX-Schicht. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -97,6 +97,23 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
|
||||
|
||||
## ✅ Erledigt
|
||||
|
||||
- [x] **🔒 Pentest R95 – Portal-Username (Manual-Modus) härten**
|
||||
- R95.1 (MEDIUM): `foo\r\nBcc:evil@x.de` → Header-Injection-Vektor
|
||||
sobald der Wert in Mail-Templates / PDF-Footer landet.
|
||||
- R95.3 (LOW): `<script>…</script>@x.de` → silent stripHtml-Mutation
|
||||
(R87.1-Pattern, dritter Treffer auf demselben Bug).
|
||||
- R95.4 (LOW): >190 Zeichen → VARCHAR-Overflow → 500 statt 400.
|
||||
- Fix: `validatePortalUsername()` in `sanitize.ts` mit Whitelist
|
||||
`^[A-Za-z0-9_\-/.@+ ]{0,100}$`. Strukturell sind CRLF, Tab, alle
|
||||
Control-Chars, Tags und Quotes raus → R95.1+R95.3 ohne extra
|
||||
Check. Max 100 → `ApiError(400)` → R95.4 sauber. Raw-Input direkt
|
||||
validiert (R87-Pattern). Eingehängt in `sanitizeContractBody`.
|
||||
- Frontend: `maxLength={100}` am Input.
|
||||
- **R95.2 bewusst nicht übernommen** (Email-Format-Pflicht): das
|
||||
Feld ist im Manual-Modus nicht zwingend eine E-Mail – Vodafone,
|
||||
1&1, EWE und Stadtwerke nutzen Kundennummern oder Pseudonyme als
|
||||
Portal-Login. Doku in `SECURITY-HARDENING.md § Runde 95`.
|
||||
|
||||
- [x] **🔒 Pentest R93 – Leerer String != fehlender Param**
|
||||
- R93.1 (INFO): `?accountId=` (explizit-leer) wurde wie `?accountId`
|
||||
weggelassen behandelt → 200 statt 400 auf optionalen Endpunkten.
|
||||
|
||||
Reference in New Issue
Block a user