From adc3b70492ea612665e27ae2b292258d3e28de41 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Wed, 20 May 2026 01:13:19 +0200 Subject: [PATCH] Pentest 2026-05-20 MEDIUM+LOW Follow-ups MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MEDIUM – Consent-Mass-Assignment: PUT /api/gdpr/customer/:id/consents/:type nahm source/documentPath/ version ungefiltert aus dem Body. Portal-User konnte source="ADMIN_OVERRIDE", version=" in * companyName landete vorher ungefiltert in der DB. + * + * Pentest 2026-05-20 (LOW): zusätzlich werden Skript-URI-Schemata + * unschädlich gemacht (`javascript:`, `data:`, `vbscript:`). Plain-Text- + * Felder enthalten legitime URLs ohnehin selten; ein gespeicherter + * `javascript:alert(1)` würde ansonsten in einem `` + * sofort feuern. */ +const DANGEROUS_URI_SCHEMES = /(?:javascript|data|vbscript)\s*:/gi; + export function stripHtml(value: unknown): unknown { if (typeof value !== 'string') return value; return value .replace(/]*>[\s\S]*?<\/script>/gi, '') .replace(/]*>[\s\S]*?<\/style>/gi, '') - .replace(/<\/?[a-z][^>]*>/gi, ''); + .replace(/<\/?[a-z][^>]*>/gi, '') + // Schema durch harmloses Token ersetzen – komplette Entfernung + // könnte legitimen Text wie "Java Script :)" verändern, dieses + // Pattern matcht nur das Schema selbst. + .replace(DANGEROUS_URI_SCHEMES, 'blocked:'); } /** diff --git a/docs/todo.md b/docs/todo.md index 8a8b45a5..e0af2329 100644 --- a/docs/todo.md +++ b/docs/todo.md @@ -120,6 +120,34 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung - **Live-verifiziert**: 4867 Datensätze + 1 Datei in 13.2s wiederhergestellt, Log-Modal zeigt den vollständigen Verlauf. +- [x] **🛡️ Pentest 2026-05-20 MEDIUM+LOW: Consent + URI-Sanitization** + - **MEDIUM Consent-Mass-Assignment**: PUT `/api/gdpr/customer/:id/consents/:type` + nahm `source`, `documentPath`, `version` ungefiltert aus dem Body + – Portal-User konnte `source: "ADMIN_OVERRIDE"`, `version: + "