feat(security): Scanner-sichere Zwischenseite für Magic Links, Rate Limiting & Bot-Schutz #5

Merged
andre merged 2 commits from a4/scanner-safety-and-rate-limiting into main 2026-09-27 10:07:31 +02:00
Owner

Zusammenfassung

  1. Punkt 1 (Virenscanner-Schutz für Magic Links):

    • GET /auth/verify: Token wird nicht mehr direkt konsumiert, sondern non-destruktiv validiert (verifyMagicLinkToken). Liefert eine brandkonforme HTML-Zwischenseite (renderVerifyPage) mit Bestätigungsformular.
    • Verhindert, dass automatisierte Scanner (Microsoft Defender Safelinks, Google Workspace) den Single-Use-Token per GET-Prefetch vorzeitig entwerten.
    • POST /auth/verify: Erst das Absenden des Formulars (oder JSON-POST) ruft redeemMagicLinkToken auf, konsumiert den Token und setzt das HttpOnly-Session-Cookie (__Host-ks_partner_session).
  2. Punkt 3 (Rate-Limiting & Bot-Schutz):

    • Neuer zero-dependency Sliding-Window Limiter MemoryRateLimiter (src/core/security/rate-limiter.js) mit unref-Bereinigungstimer.
    • GET /api/partners/match: Rate Limit (60 req/min pro IP) + strikte 5-stellige PLZ-Validierung (/^\d{5}$/).
    • POST /api/partners/onboard: Rate Limit (5 req/15 min pro IP) + Honeypot-Erkennung (website_hp, hp_confirm, fax_field).
    • POST /auth/verify: Rate Limit (15 req/5 min pro IP) gegen Token-Bruteforce.
  3. Punkt 4 (Legacy API-Parität & Drift-Schutz):

    • public/api.php mit X-API-Deprecation und X-Canonical-API markiert und alle eingehenden Requests per HTTP 307 direkt auf das Node.js Backend unter https://partner.kurvenschule.cloud weitergeleitet.
  4. Tests:

    • 42/42 Contract- & Integration-Tests grün (inkl. Scanner-Prefetch-Simulation, POST-Redemption, PLZ-Validierung, Honeypot und Rate-Limiting).
## Zusammenfassung 1. **Punkt 1 (Virenscanner-Schutz für Magic Links):** - `GET /auth/verify`: Token wird nicht mehr direkt konsumiert, sondern non-destruktiv validiert (`verifyMagicLinkToken`). Liefert eine brandkonforme HTML-Zwischenseite (`renderVerifyPage`) mit Bestätigungsformular. - Verhindert, dass automatisierte Scanner (Microsoft Defender Safelinks, Google Workspace) den Single-Use-Token per GET-Prefetch vorzeitig entwerten. - `POST /auth/verify`: Erst das Absenden des Formulars (oder JSON-POST) ruft `redeemMagicLinkToken` auf, konsumiert den Token und setzt das HttpOnly-Session-Cookie (`__Host-ks_partner_session`). 2. **Punkt 3 (Rate-Limiting & Bot-Schutz):** - Neuer zero-dependency Sliding-Window Limiter `MemoryRateLimiter` (`src/core/security/rate-limiter.js`) mit unref-Bereinigungstimer. - `GET /api/partners/match`: Rate Limit (60 req/min pro IP) + strikte 5-stellige PLZ-Validierung (`/^\d{5}$/`). - `POST /api/partners/onboard`: Rate Limit (5 req/15 min pro IP) + Honeypot-Erkennung (`website_hp`, `hp_confirm`, `fax_field`). - `POST /auth/verify`: Rate Limit (15 req/5 min pro IP) gegen Token-Bruteforce. 3. **Punkt 4 (Legacy API-Parität & Drift-Schutz):** - `public/api.php` mit `X-API-Deprecation` und `X-Canonical-API` markiert und alle eingehenden Requests per HTTP 307 direkt auf das Node.js Backend unter `https://partner.kurvenschule.cloud` weitergeleitet. 4. **Tests:** - 42/42 Contract- & Integration-Tests grün (inkl. Scanner-Prefetch-Simulation, POST-Redemption, PLZ-Validierung, Honeypot und Rate-Limiting).
feat(security): Scanner-sichere Zwischenseite für Magic Links, Rate Limiting & Bot-Schutz
All checks were successful
Unit & Contract Tests / Node.js Contract Tests (pull_request) Successful in 7s
a3abfbf826
fix(security): Typ-Guards für Token-Strings, URL-Decoded Path-Traversal Blockierung
All checks were successful
Unit & Contract Tests / Node.js Contract Tests (pull_request) Successful in 8s
8a05039c75
andre merged commit 1c0b5bcea9 into main 2026-09-27 10:07:31 +02:00
andre deleted branch a4/scanner-safety-and-rate-limiting 2026-09-27 10:07:31 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
andre/kurven-schule-partner!5
No description provided.