From 3dea381983f9a4506d47c45659a2dd6af7a03910 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sun, 17 May 2026 09:21:52 +0200 Subject: [PATCH] fix: UUID-Hashes (Datenschutz-Link) nicht als truncated-ID blocken MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Der Integer-Truncation-Filter aus Runde 12 war zu breit: er hat jedes Pfad-Segment geblockt, das mit einer Ziffer beginnt und nicht aus reinen Ziffern besteht – also auch UUIDs wie "3018c9b9-b337-4c9a-a402-b47872f8ddae". Damit warf der Datenschutz- Link beim ersten Aufruf "Ungültiger Link" (in Wahrheit 400 vom Filter). Engere Heuristik: ^\d+[a-zA-Z]+$ – reine Ziffern gefolgt von reinen Buchstaben (`6abc`, `12foo`). UUIDs haben Bindestriche und Hex- Buchstaben gemischt, werden korrekt durchgelassen. Live-verifiziert: Datenschutz-Link mit UUID → 200; /customers/6abc → weiterhin 400; /customers/3 → 200. Co-Authored-By: Claude Opus 4.7 (1M context) --- backend/src/index.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/backend/src/index.ts b/backend/src/index.ts index c095891f..7b84deaf 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -268,12 +268,15 @@ app.use('/api', (_req, res, next) => { // Validierung. Pentest Runde 7 (2026-05-17), LOW. // // `app.param()` greift nicht auf in Sub-Router gemounteten Routes, deshalb -// machen wir es als Pfad-Heuristik: jedes Segment, das mit einer Ziffer -// beginnt aber nicht aus reinen Ziffern besteht (`6abc`, `12foo`), wird als -// Tippfehler/Manipulation behandelt. +// machen wir es als Pfad-Heuristik. Geblockt wird NUR `^\d+[a-zA-Z]+$` – +// reine Ziffern gefolgt von reinen Buchstaben (`6abc`, `12foo`). UUIDs wie +// `3018c9b9-b337-4c9a-a402-b47872f8ddae` (Consent-Hash) und Datumsstrings +// `2024-05-17` haben Bindestriche / gemischten Aufbau und werden korrekt +// nicht geblockt. +const TRUNCATED_ID_PATTERN = /^\d+[a-zA-Z]+$/; app.use('/api', (req, res, next) => { for (const seg of req.path.split('/')) { - if (seg.length > 0 && /^\d/.test(seg) && !/^\d+$/.test(seg)) { + if (seg.length > 0 && TRUNCATED_ID_PATTERN.test(seg)) { res.status(400).json({ success: false, error: 'Ungültige ID im URL-Pfad' }); return; }