fix(csp): Inline-Skripte in Prod erlauben (Next.js-Hydration)

Prod-CSP hatte script-src 'self' ohne nonce/hash -> Next.js' Inline-Bootstrap-/
Hydration-Skripte wurden vom Browser blockiert (Login-Seite ohne JS, 'Connection
closed'). script-src um 'unsafe-inline' ergänzt (KEIN 'unsafe-eval' in Prod);
übrige CSP (default-src 'self', object-src none, frame-ancestors none, base-uri
self, form-action self) bleibt strikt. Stärkere nonce-basierte CSP via Middleware
als Hardening-Option offen.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude
2026-06-10 13:42:13 +02:00
parent 987b8c9c8f
commit 0634d8c236

View File

@@ -2,17 +2,19 @@
* Sicherheits-Header, eingehängt in next.config.ts. * Sicherheits-Header, eingehängt in next.config.ts.
* *
* Content-Security-Policy ist der zentrale Querschnitts-Schutz (Implementierungs- * Content-Security-Policy ist der zentrale Querschnitts-Schutz (Implementierungs-
* plan Z.1314): in Produktion strikt mit default-src 'self', frame-ancestors 'none' * plan Z.1314): default-src 'self', frame-ancestors 'none', form-action 'self',
* und form-action 'self'. Im Dev-Modus benötigt Next.js (HMR/React-Refresh) eine * object-src 'none'. script-src erlaubt 'unsafe-inline' (KEIN 'unsafe-eval' in
* gelockerte script-src/connect-src-Variante ('unsafe-eval' + ws: für den Dev-Socket). * Prod), da Next.js (App Router) Inline-Bootstrap-/Hydration-Skripte ohne Nonce
* ausliefert — eine strikte nonce-basierte CSP ginge nur über die Middleware
* (Hardening-Option). Im Dev zusätzlich 'unsafe-eval' + ws: (HMR/React-Refresh).
*/ */
const isProd = process.env.NODE_ENV === "production"; const isProd = process.env.NODE_ENV === "production";
const CSP = [ const CSP = [
"default-src 'self'", "default-src 'self'",
// Dev braucht eval (React Refresh) + inline; Prod bleibt strikt. // Next.js braucht Inline-Skripte (Bootstrap/Hydration, ohne Nonce); Dev zusätzlich eval.
isProd isProd
? "script-src 'self'" ? "script-src 'self' 'unsafe-inline'"
: "script-src 'self' 'unsafe-eval' 'unsafe-inline'", : "script-src 'self' 'unsafe-eval' 'unsafe-inline'",
"style-src 'self' 'unsafe-inline'", "style-src 'self' 'unsafe-inline'",
"img-src 'self' data: blob:", "img-src 'self' data: blob:",