docs: BREACH-/-Marker konkret entfernen – exact-match-Location erklärt
Folge zur User-Frage: Snippet auch für / anwenden. Wichtiger Punkt dokumentiert: NPM-Custom-Location mit prefix-`/` würde ALLE Pfade außer /api/* fangen (auch /assets/*.js) → JS-Bundle unkomprimiert ~500 KB statt 150 KB. Stattdessen exact-match `location = /` nutzen, das fängt nur die Root-URL ohne weitere Pfad-Komponente. Zwei Varianten dokumentiert: - Variante A: Custom Location im NPM-UI mit „= /" (falls Feld das akzeptiert) - Variante B: server-level snippet im Advanced-Tab des Proxy-Hosts Plus Verifikations-Befehle für „/" ohne gzip + „/assets/*.js" weiter mit gzip. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -294,8 +294,8 @@ curl -sI https://kundencenter.deine-domain.de/api/health \
|
|||||||
|
|
||||||
Pentest-Tools wie `testssl` melden BREACH **trotzdem weiter** für die
|
Pentest-Tools wie `testssl` melden BREACH **trotzdem weiter** für die
|
||||||
Root-URL `/`, weil die SPA-`index.html` bewusst weiter gzip-komprimiert
|
Root-URL `/`, weil die SPA-`index.html` bewusst weiter gzip-komprimiert
|
||||||
ausgeliefert wird (Performance: 50 KB → ~10 KB). Das ist **bewusst
|
ausgeliefert wird (Performance: 50 KB → ~10 KB). Bei OpenCRM ist der
|
||||||
akzeptiert**, weil der Angriff dort nicht ausnutzbar ist:
|
Angriff dort nicht ausnutzbar:
|
||||||
|
|
||||||
- Die `/`-Response ist die statische `index.html` aus dem Vite-Build
|
- Die `/`-Response ist die statische `index.html` aus dem Vite-Build
|
||||||
- Sie reflektiert **keinen user-controlled Input**
|
- 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)
|
Refresh-Token im httpOnly-Cookie – beides nicht im HTML-Body)
|
||||||
|
|
||||||
Ohne Secret-im-Body und ohne Input-Reflektion hat BREACH keinen Hebel.
|
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
|
##### Wer den Audit-Marker trotzdem weg haben will
|
||||||
extra pro Tab-Reload.
|
|
||||||
|
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/<file>.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
|
## Developer-Tools aktivieren
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user