fix: UUID-Hashes (Datenschutz-Link) nicht als truncated-ID blocken
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) <noreply@anthropic.com>
This commit is contained in:
@@ -268,12 +268,15 @@ app.use('/api', (_req, res, next) => {
|
|||||||
// Validierung. Pentest Runde 7 (2026-05-17), LOW.
|
// Validierung. Pentest Runde 7 (2026-05-17), LOW.
|
||||||
//
|
//
|
||||||
// `app.param()` greift nicht auf in Sub-Router gemounteten Routes, deshalb
|
// `app.param()` greift nicht auf in Sub-Router gemounteten Routes, deshalb
|
||||||
// machen wir es als Pfad-Heuristik: jedes Segment, das mit einer Ziffer
|
// machen wir es als Pfad-Heuristik. Geblockt wird NUR `^\d+[a-zA-Z]+$` –
|
||||||
// beginnt aber nicht aus reinen Ziffern besteht (`6abc`, `12foo`), wird als
|
// reine Ziffern gefolgt von reinen Buchstaben (`6abc`, `12foo`). UUIDs wie
|
||||||
// Tippfehler/Manipulation behandelt.
|
// `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) => {
|
app.use('/api', (req, res, next) => {
|
||||||
for (const seg of req.path.split('/')) {
|
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' });
|
res.status(400).json({ success: false, error: 'Ungültige ID im URL-Pfad' });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user