diff --git a/backend/src/index.ts b/backend/src/index.ts index fa0c64ae..363f49ae 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -84,16 +84,25 @@ if (!process.env.ENCRYPTION_KEY || process.env.ENCRYPTION_KEY.length !== 64) { const app = express(); const PORT = process.env.PORT || 3001; -// Hinter einem Reverse-Proxy (Nginx/Plesk) läuft der Server typisch auf localhost. -// `trust proxy = 'loopback'` vertraut nur Connections von 127.0.0.1 / ::1 -// (= lokaler Reverse-Proxy). Damit kann ein Angreifer mit DIREKTEM Zugriff -// auf das Backend nicht via X-Forwarded-For den Rate-Limiter umgehen, -// während gleichzeitig der lokale Reverse-Proxy die echte Client-IP liefern darf. +// Trust-Proxy-Konfiguration für `req.ip` und `X-Forwarded-For`. // -// WICHTIG für Production: Backend nur auf 127.0.0.1 lauschen lassen -// (LISTEN_ADDR=127.0.0.1) – sonst kann ein direkter Connect von außen -// trotzdem als loopback gelten, falls das Routing das so durchstellt. -app.set('trust proxy', 'loopback'); +// Zwei Szenarien: +// 1) **HTTPS_ENABLED=true** (Produktion mit vorgelagertem TLS-Proxy auf +// EIGENER Box, z.B. Nginx Proxy Manager): `trust proxy = 1` vertraut +// genau einem Hop → req.ip = echter Client (nicht der Proxy). +// Voraussetzung: Backend ist NICHT direkt aus dem Internet erreichbar, +// sonst könnte ein Direkt-Connect X-Forwarded-For faken und den +// Rate-Limiter / Security-Monitor umgehen. Bei NPM-Setup ist das +// durch das Docker-Network + nicht-veröffentlichten Backend-Port +// gewährleistet. +// 2) **HTTPS_ENABLED=false** (lokales Dev oder direkter http://ip:port- +// Zugriff): `loopback` reicht – kein vertrauenswürdiger Hop davor. +// +// Vor dem Fix stand das auf `'loopback'` was im Produktiv-NPM-Setup +// IMMER die Proxy-IP statt der Client-IP lieferte → Rate-Limit und +// IDOR-Threshold-Detection sahen alle Angriffe als von „einem" Client. +const trustProxyValue = process.env.HTTPS_ENABLED === 'true' ? 1 : 'loopback'; +app.set('trust proxy', trustProxyValue); // ==================== SECURITY MIDDLEWARE ====================