92d2e62e79
Folgefix zum CRITICAL-IDOR auf Stressfrei-Sub-Routes: der separate /customers/:id-Endpoint sanitizt seinen Output schon, aber GET /contracts/:id embeddete weiterhin das volle Customer-Objekt inkl. - portalPasswordHash (bcrypt-Hash des Portal-Login-Passworts) - portalPasswordEncrypted (AES-256-GCM des Klartext-Passworts) - portalPasswordResetToken (langlebiger 1-time-Token) Zwei Lecks im contract.service: - getContractById hatte `customer: true` ohne Sanitize - createContract hatte dasselbe Muster Beide jetzt mit sanitizeCustomerStrict() nach dem Load. Der Helper war schon im utils/sanitize.ts vorhanden – wurde nur nicht aufgerufen. Live-verifiziert: GET /api/contracts/1 → embedded customer enthält 30 saubere Felder, KEIN portalPasswordHash/Encrypted/ResetToken mehr. Weitere `customer: true`-Stellen geprüft und freigegeben: - pdfTemplate.service.generateFilledPdf: nur internal, gibt PDF-Buffer zurück - cachedEmail.controller.saveEmailAsPdf: nur internal für File-Ops - getAllContracts: schon mit explizitem Select (5 sichere Felder) - updateContract: kein customer-Include Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>