Wie ein guter Satz Header aussieht
strict-transport-security: max-age=31536000; includeSubDomains; preload
content-security-policy: default-src 'none'; script-src 'self'; style-src 'self'; img-src 'self' data:; font-src 'self'; connect-src 'self'; object-src 'none'; base-uri 'none'; form-action 'self'; frame-ancestors 'none'; upgrade-insecure-requests
x-content-type-options: nosniff
x-frame-options: DENY
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=(), payment=()
cross-origin-opener-policy: same-origin
cross-origin-resource-policy: same-origin Das sendet diese Website. Für eine Anwendung mit Inline-Skripten wechselt die CSP zu Nonces: script-src 'nonce-<zufällig pro Antwort>' 'strict-dynamic', was strenger und leichter zu pflegen ist als eine Host-Allowlist.
Wie die CSP-Bewertung denkt
Eine CSP existiert, um zu begrenzen, was ein Angreifer tun kann, sobald er eine Injektionsstelle gefunden hat. Die Bewertung fragt also: Können mit einem injizierten String Skripte laufen? 'unsafe-inline' ohne Nonces sagt ja. Eine Wildcard- oder Schema-Quelle (*, https:, data:) sagt ja. Ein Host, der vom Angreifer wählbare Skripte ausliefert (öffentliche CDNs mit altem AngularJS, JSONP-Endpunkte auf googleapis.com, Storage-Buckets), sagt ja; deshalb ist eine lange Allowlist beliebter CDNs schwächer, als sie aussieht. Fehlende object-src und base-uri sind die zwei Direktiven, die vergessen werden und die Tür wieder öffnen. Die übrigen Direktiven (frame-ancestors, form-action, default-src) zählen für Clickjacking und Datenabfluss statt für Skriptausführung und werden daher niedriger gewichtet.
Wo Header gesetzt werden
- nginx:
add_header Name "wert" always;— beachten Sie, dass einadd_headerin einerlocationalle auf Server-Ebene aufhebt (testen mit dem nginx-Location-Tester). - Apache:
Header always set Name "wert"im vhost oder in .htaccess (mod_headers). - Cloudflare: HSTS unter SSL/TLS → Edge Certificates; andere Header über Transform Rules → Modify Response Header, was auch für Origins funktioniert, die Sie nicht ändern können.
- Anwendungs-Frameworks: helmet (Node), secure_headers (Rails), django-csp, Laravel-Middleware — diese erzeugen auch Nonces pro Antwort.
Eine CSP sicher einführen
- Als
Content-Security-Policy-Report-Onlymit einemreport-to-Endpunkt senden und eine Woche die Berichte beobachten. - Die echten Verstöße beheben (Inline-Handler, Drittanbieter-Widgets), das Rauschen von Browser-Erweiterungen ignorieren.
- Den Header-Namen auf
Content-Security-Policyumstellen. Report-Only zum Testen der nächsten Änderung behalten.
Fragen
Welche Header sind am wichtigsten?
Für eine Website mit Nutzerinteraktion: zuerst Content-Security-Policy, dann Strict-Transport-Security und X-Content-Type-Options. Framing- und Referrer-Policies sind billig hinzuzufügen. Der Rest ist Hygiene: Versionen verbergen, Cookies flaggen, veraltete Header entfernen.
Warum wird meine CSP als schwach bewertet, obwohl sie nur vertrauenswürdige Hosts listet?
Weil Vertrauen nicht die Frage ist; die Frage ist, ob irgendein Skript auf diesen Hosts dazu gebracht werden kann, Angreifercode auszuführen. Öffentliche CDNs hosten tausende Bibliotheksversionen, manche mit bekannten Gadgets (AngularJS-Templates, JSONP-Callbacks). Eine Nonce-basierte Policy mit strict-dynamic hat dieses Problem nicht, und diese Seite bewertet sie als stärkste Konfiguration.
Ist X-XSS-Protection noch nützlich?
Nein. Chrome hat den XSS-Auditor 2019 entfernt, Edge 2018; Firefox hatte nie einen. Der Header ist als „0“ harmlos und war als „1; mode=block“ in alten Browsern schädlich. Entfernen Sie ihn und nutzen Sie CSP.
Wie bekomme ich die Header einer Seite, die weiterleitet?
curl -sIL https://example.com/ gibt jede Antwort der Kette aus. Fügen Sie alles ein; die letzte Antwort wird benotet und die Weiterleitungen werden aufgelistet. Prüfen Sie, dass http:// in einem Schritt auf https:// weiterleitet.
Entspricht die Note der von securityheaders.com?
Ungefähr: Beide zählen dieselben sechs Kern-Header. Diese Seite bewertet zusätzlich den CSP-Inhalt statt nur das Vorhandensein und zieht für Lecks und veraltete Header ab, sodass eine Website mit schwacher CSP hier schlechter abschneidet.