CSP für Nuxt 3 konfigurieren

Schritt-für-Schritt-Anleitung: Content Security Policy in Nuxt 3 einrichten — mit nuxt-security Modul und automatischen Nonces, von Report-Only bis Enforcement.

Nuxt 3 · Schritt für Schritt

Content Security Policy in Nuxt 3

Content Security Policy (CSP) ist der wichtigste HTTP-Security-Header gegen Cross-Site Scripting (XSS). Er teilt dem Browser mit, welche Ressourcen geladen werden dürfen — und blockiert alles andere. CSP ist mit 35 von 166 Punkten der einflussreichste Header im Wolf-Agents Web Security Check.

In Nuxt 3 gibt es drei Wege zur CSP-Konfiguration: das nuxt-security Modul generiert automatisch Nonces pro Request und ist der empfohlene Ansatz. Alternativ setzen routeRules eine statische CSP, und Nitro Server Middleware bietet maximale Kontrolle über dynamische Header.

1 Schritt 1 von 4

CSP mit nuxt-security konfigurieren

Das nuxt-security Modul ist der sicherste Weg für CSP in Nuxt 3. Es generiert automatisch kryptografische Nonces pro Request und injiziert sie in Script-Tags. Installation: npx nuxi module add nuxt-security. Starten Sie im Report-Only-Modus, um Violations zu erkennen.

nuxt.config.ts Empfohlen
// nuxt.config.ts — CSP mit nuxt-security (empfohlen)
export default defineNuxtConfig({
  modules: ['nuxt-security'],

  security: {
    nonce: true,
    headers: {
      contentSecurityPolicy: {
        'default-src': ["'self'"],
        'script-src': [
          "'self'",
          "'nonce-{{nonce}}'",
          "'strict-dynamic'",
        ],
        'style-src': ["'self'", "'unsafe-inline'"],
        'img-src': ["'self'", "data:"],
        'font-src': ["'self'"],
        'connect-src': ["'self'"],
        'object-src': ["'none'"],
        'base-uri': ["'self'"],
        'form-action': ["'self'"],
        'frame-ancestors': ["'self'"],
      },
    },
  },
})
Was bedeutet 'nonce-{{nonce}}'?

nuxt-security ersetzt {{nonce}} automatisch durch einen echten kryptografischen Nonce bei jedem Request. 'strict-dynamic' erlaubt Scripts, die von einem Nonce-autorisierten Script geladen werden — ideal für Vue-Hydration.

2 Schritt 2 von 4

Violations analysieren und CSP anpassen

Öffnen Sie die Browser DevTools (F12) und die Console. CSP-Violations erscheinen als Warnungen mit der blockierten Ressource und der verletzten Direktive. Passen Sie die CSP-Konfiguration in nuxt.config.ts an, bis keine unerwarteten Violations mehr auftreten.

Violation Lösung in nuxt.config.ts
Vue-Hydration blockiert 'strict-dynamic' in script-src + nonce: true
Google Fonts blockiert fonts.googleapis.com in style-src, fonts.gstatic.com in font-src
API-Calls blockiert API-Domain zu connect-src hinzufügen
Analytics blockiert Analytics-Domain zu script-src und connect-src
iframe-Einbettung blockiert *.youtube.com in frame-src hinzufügen
3 Schritt 3 von 4

Alternative: Nitro Server Middleware

Für maximale Kontrolle über die CSP setzen Sie den Header per Nitro Server Middleware. Dieser Ansatz erlaubt bedingte Logik — beispielsweise unterschiedliche CSP-Policies für verschiedene Routen.

server/middleware/csp.ts Middleware
// server/middleware/csp.ts — manuelle Nonces
import crypto from 'node:crypto';

export default defineEventHandler((event) => {
  const csrNonce = crypto.randomBytes(16).toString('base64');
  event.context.nonce = csrNonce;

  setHeader(event,
    'Content-Security-Policy',
    [
      "default-src 'self'",
      "script-src 'self' 'nonce-" + csrNonce + "' 'strict-dynamic'",
      "style-src 'self' 'unsafe-inline'",
      "img-src 'self' data:",
      "font-src 'self'",
      "connect-src 'self'",
      "object-src 'none'",
      "base-uri 'self'",
      "form-action 'self'",
    ].join('; ')
  );
})
nuxt.config.ts Fallback
// nuxt.config.ts — statische CSP ohne Nonces
export default defineNuxtConfig({
  routeRules: {
    '/**': {
      headers: {
        'Content-Security-Policy':
          "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; object-src 'none'; base-uri 'self'",
      },
    },
  },
})
routeRules-CSP ist statisch — ohne Nonces. 'unsafe-inline' in script-src ist deutlich weniger sicher als Nonce-basierte CSP. Verwenden Sie routeRules nur als Fallback für SSG-Deployments.
4 Schritt 4 von 4

CSP verifizieren

Erstellen Sie einen Production-Build und prüfen Sie den CSP-Header. Der Wolf-Agents Web Security Check analysiert Ihre CSP detailliert — inklusive Nonce-Erkennung, Direktiven-Bewertung und strict-dynamic-Support.

Terminal Verifizieren
# Production-Build und Header prüfen
npx nuxi build
node .output/server/index.mjs

curl -sI https://ihre-domain.de | grep -i content-security

# Erwartete Ausgabe:
# Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-abc123...' 'strict-dynamic'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; connect-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'self'

Häufige Fehler bei CSP in Nuxt 3

useHead() setzt kein HTTP-Header

useHead() setzt <meta http-equiv>-Tags — keine echten HTTP-Header. Meta-CSP unterstützt kein frame-ancestors und kein report-uri. Verwenden Sie immer Server-seitige Header.

nuxt-security überschreibt manuelle Header

Wenn nuxt-security aktiv ist, überschreibt es routeRules-CSP-Header. Konfigurieren Sie CSP ausschließlich über das security-Objekt in nuxt.config.ts.

SSG-Build hat keine Server-CSP

nuxt generate erzeugt statische HTML-Dateien. CSP-Header müssen auf dem Hosting-Anbieter (Vercel vercel.json, Netlify _headers) konfiguriert werden.

Nonce fehlt bei dynamischen Scripts

Scripts, die per document.createElement('script') eingefügt werden, erhalten keinen Nonce. 'strict-dynamic' löst das Problem — es erlaubt Scripts, die von Nonce-autorisierten Scripts geladen werden.

Compliance-Relevanz

PCI DSS 4.0 (Anforderung 6.4.3) fordert ab März 2025 die Kontrolle aller auf Zahlungsseiten geladenen Scripts — eine Nonce-basierte CSP erfüllt diese Anforderung. NIS2 verlangt technische Maßnahmen zur Cybersicherheit — CSP ist der wirksamste Schutz gegen XSS-Angriffe. Der Wolf-Agents Web Security Check bewertet CSP mit bis zu 35 Punkten und dokumentiert den Umsetzungsstand.

Wie steht Ihre Domain bei Content Security Policy?

Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.