Pentest 81.1 (MEDIUM): Self-Forward erzeugte Mail-Loop am Provider

Bug: Die Stressfrei-Adresse selbst (max@stressfrei-wechseln.net)
konnte als zusätzliches Weiterleitungsziel eingetragen werden,
auch Plus-Varianten. Plesk leitet auf sich selbst um → Mail-Loop.

Backend setAdditionalForwards: lädt zusätzlich meta.email, vergleicht
canonicalEmailKey gegen canonicalEmailKey(meta.email). Bei Treffer
hartes ApiError(400) mit klarer "zeigt auf die Adresse selbst –
Mail-Loop"-Meldung statt silent dedup – der User soll merken, dass
sein Eintrag bewusst abgelehnt wurde.

Frontend AdditionalForwardsModal: zusätzliche proaktive Validierung
im Sub-Modal mit identischem canonicalize-Helper. Neuer selfEmail-
Prop, damit auch der Create-Modus (vor Persist) den Check fahren
kann. Spart Roundtrip + sofort sprechende Meldung.
This commit is contained in:
2026-06-18 15:55:01 +02:00
parent b3469483ca
commit 5bb048c534
3 changed files with 59 additions and 3 deletions
+17
View File
@@ -97,6 +97,23 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
## ✅ Erledigt
- [x] **🔒 Pentest 81.1 (MEDIUM): Self-Forward erzeugte Mail-Loop am Provider**
- Bug: User konnte die Stressfrei-Adresse selbst (z.B.
`max.mustermann@stressfrei-wechseln.net`) als zusätzliches
Weiterleitungsziel eintragen auch Plus-Varianten davon. Plesk
leitet auf sich selbst um → Mail-Loop.
- Backend (`setAdditionalForwards`): zieht jetzt zusätzlich
`meta.email` aus der DB und vergleicht `canonicalEmailKey(eintrag)`
gegen `canonicalEmailKey(meta.email)`. Bei Treffer hartes
`ApiError(400)` mit klarer Self-Forward-Meldung statt silent dedup
der User soll merken, dass sein Eintrag bewusst abgelehnt wurde.
- Frontend (`AdditionalForwardsModal`): zusätzlich proaktive
Validierung im Sub-Modal mit identischem `canonicalize`-Helper
(Plus-Tag strippen, lowercase). Neuer Prop `selfEmail`, damit
auch der Create-Modus (vor dem Persistieren) den Check fahren
kann. Spart einen Roundtrip + zeigt sofort eine sprechende
Meldung „… zeigt auf die Adresse selbst Mail-Loop".
- [x] **🔒 Pentest 77.3 (LOW): `requireIdParam` ließ Float-IDs durch**
- `Number.isInteger(parseInt('4.5'))` ist `true`, weil `parseInt`
den Nachkomma-Teil silent abschneidet. Damit traf `/.../4.5/...`