Pentest 77.3 (LOW): requireIdParam blockt Float-IDs
Number.isInteger(parseInt('4.5')) ist true, weil parseInt den
Nachkomma-Teil silent verwirft. /.../4.5/... traf die echte ID 4
statt 400 zu liefern – gleiches für 4.0 und Exp-Notation (4e1).
Fix: vor dem Parsen Regex /^\\d+$/ gegen die rohe Route-Eingabe.
Nur reine Ziffern erlaubt, keine Floats / Exp / Vorzeichen /
Whitespace / Hex.
Smoke-Test (17 Cases): 4.0, 4.5, 4e1, 4E2, 0, -4, +4, 0x10, 1.0e0,
leading/trailing Space alle abgelehnt; 1, 4, 100, 9999999
durchgewunken.
This commit is contained in:
@@ -6,10 +6,18 @@ import { canAccessCustomer, canAccessStressfreiEmail } from '../utils/accessCont
|
||||
import { ApiError } from '../utils/apiError.js';
|
||||
|
||||
// Pentest 71.3 (INFO): `parseInt(...)` ohne NaN-Check gab bei
|
||||
// `/stressfrei-emails/abc/...` einen generischen 500 zurück. Nicht
|
||||
// kritisch, aber irreführend und log-spammend.
|
||||
// `/stressfrei-emails/abc/...` einen generischen 500 zurück.
|
||||
//
|
||||
// Pentest 77.3 (LOW): `Number.isInteger(parseInt(...))` ließ Floats
|
||||
// und Exponential-Notation durch – `4.0`, `4.5`, `4e1` werden alle
|
||||
// zu `4` geparst und treffen die echte ID 4. Fix: erst gegen
|
||||
// `/^\d+$/` validieren, dann erst parsen.
|
||||
function requireIdParam(req: AuthRequest, res: Response, paramName: string): number | null {
|
||||
const raw = req.params[paramName];
|
||||
if (typeof raw !== 'string' || !/^\d+$/.test(raw)) {
|
||||
res.status(400).json({ success: false, error: `Ungültige ID: ${raw}` } as ApiResponse);
|
||||
return null;
|
||||
}
|
||||
const parsed = Number.parseInt(raw, 10);
|
||||
if (!Number.isInteger(parsed) || parsed < 1) {
|
||||
res.status(400).json({ success: false, error: `Ungültige ID: ${raw}` } as ApiResponse);
|
||||
|
||||
Reference in New Issue
Block a user