diff --git a/README.md b/README.md index 887bfcd1..d3c42b9b 100644 --- a/README.md +++ b/README.md @@ -294,8 +294,8 @@ curl -sI https://kundencenter.deine-domain.de/api/health \ Pentest-Tools wie `testssl` melden BREACH **trotzdem weiter** für die Root-URL `/`, weil die SPA-`index.html` bewusst weiter gzip-komprimiert -ausgeliefert wird (Performance: 50 KB → ~10 KB). Das ist **bewusst -akzeptiert**, weil der Angriff dort nicht ausnutzbar ist: +ausgeliefert wird (Performance: 50 KB → ~10 KB). Bei OpenCRM ist der +Angriff dort nicht ausnutzbar: - Die `/`-Response ist die statische `index.html` aus dem Vite-Build - Sie reflektiert **keinen user-controlled Input** @@ -303,9 +303,63 @@ akzeptiert**, weil der Angriff dort nicht ausnutzbar ist: Refresh-Token im httpOnly-Cookie – beides nicht im HTML-Body) Ohne Secret-im-Body und ohne Input-Reflektion hat BREACH keinen Hebel. -Wer den Audit-Marker trotzdem loswerden will, fügt eine weitere -NPM-Custom-Location für `/` mit `gzip off;` hinzu – kostet aber 40 KB -extra pro Tab-Reload. + +##### Wer den Audit-Marker trotzdem weg haben will + +Wichtig: nicht einfach eine Custom-Location für `/` mit `gzip off` +anlegen – das wäre ein **prefix-Match** und würde **alle** Pfade +außer `/api/*` betreffen, also auch `/assets/*.{js,css}`. Das JS-Bundle +käme dann unkomprimiert (~500 KB statt ~150 KB) → spürbarer +Performance-Verlust für nichts. + +Sauber ist eine **exact-Match-Location** (`location = /`) – die fängt +nur die Root-URL ohne weitere Pfad-Komponente: + +**Variante A** – Custom Location im NPM-UI (falls `= /` im +„Define location"-Feld akzeptiert wird): + +| Feld | Wert | +|---|---| +| Define location | `= /` | +| Scheme | `http` | +| Forward Hostname/IP | wie im Haupt-Host | +| Forward Port | `3010` | + +Im Zahnrad-Edit der Location: +```nginx +gzip off; +proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +proxy_set_header X-Real-IP $remote_addr; +# Information-Disclosure-Header weg (Pentest-Hygiene): +more_clear_headers Server X-Served-By; +``` + +**Variante B** – wenn das NPM-UI das `=` nicht akzeptiert, dieselbe +Logik im **Advanced**-Tab des Proxy-Hosts: +```nginx +location = / { + gzip off; + proxy_pass $forward_scheme://$server:$port; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Real-IP $remote_addr; + more_clear_headers Server X-Served-By; +} +``` + +Verifikation – `/` ohne gzip, `/assets/*` aber weiter mit: +```bash +# Root: kein Content-Encoding mehr +curl -sI -H 'Accept-Encoding: gzip' https://kundencenter.deine-domain.de/ \ + | grep -i content-encoding + +# /assets/.js: weiterhin gzip (Performance bleibt erhalten) +JS=$(curl -s https://kundencenter.deine-domain.de/ | grep -oE 'assets/index-[A-Za-z0-9_-]+\.js' | head -1) +curl -sI -H 'Accept-Encoding: gzip' "https://kundencenter.deine-domain.de/$JS" \ + | grep -i content-encoding +``` + +Kostet 40 KB extra pro Tab-Reload – aber dafür ist auch der letzte +BREACH-Marker weg und Pentest-Reports landen auf 0×MEDIUM. ## Developer-Tools aktivieren