Pentest R102: contractNumber-Whitelist nachgezogen
INFO-Finding: die interne CRM-Vertragsnummer war im Update-Path
nicht durch validateContractIdentifier abgedeckt. <script>… →
stripHtml → leerer String → Vertragsnummer silent überschrieben
(R87.1-Pattern auf einem sechsten Feld).
Fix: contractNumber zu CONTRACT_IDENTIFIER_FIELDS hinzugefügt.
Bestehende Whitelist (^[A-Za-z0-9_\-/. ]{0,100}$) und Raw-Input-
Validierung greifen automatisch. Legitime generierte Nummern
(GAS-MPVJ4P10FE8) bleiben OK, <script>/Overflow/CRLF/Tags → 400.
Kein Migration- oder Frontend-Change – der Fix nutzt den
bestehenden R86-Mechanismus.
Doku in SECURITY-HARDENING.md § Runde 102 und docs/todo.md.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -358,6 +358,14 @@ export function validateOptionalIsoDate(raw: unknown, fieldLabel: string): strin
|
||||
// Kunden-/Vertrags-Nummer und bleibt deutlich unter dem VARCHAR(191)-
|
||||
// Limit der DB-Spalte.
|
||||
const CONTRACT_IDENTIFIER_FIELDS: ReadonlySet<string> = new Set([
|
||||
// Interne CRM-Vertragsnummer. Wird beim Create serverseitig generiert
|
||||
// (`generateContractNumber`), aber der Update-Path filtert sie nicht
|
||||
// aus – ein Admin (oder Angreifer mit users:update+contracts:update-
|
||||
// JWT) könnte sie sonst überschreiben. Pentest 2026-07-04 INFO:
|
||||
// `<script>` wurde durch stripHtml zu leerem String → silent Overwrite
|
||||
// der Vertragsnummer. Whitelist analog zu den 5 Anbieter-/Vertriebs-
|
||||
// Nummern-Feldern, damit der Pattern konsistent bleibt.
|
||||
'contractNumber',
|
||||
'customerNumberAtProvider',
|
||||
'contractNumberAtProvider',
|
||||
'orderNumberAtSalesPlatform',
|
||||
|
||||
Reference in New Issue
Block a user