So verwenden Sie die erzeugte Nonce
Die Vorlage CSP-Nonce ist aktiv: 16 Zufallsbytes in Base64, also ein Wert aus 24 Zeichen, der auf
==endet.Zum Einfügen zeigt den Header und das passende Tag, zum Beispiel:
Content-Security-Policy: script-src 'nonce-SQu4/GjzG3plY6CUwsx8gA==' <script nonce="SQu4/GjzG3plY6CUwsx8gA==" src="/app.js"></script>Nutzen Sie sie, um eine Policy auf einer lokalen Testseite oder in einer Staging-Konfiguration auszuprobieren. Mit Neu erzeugen erhalten Sie einen anderen Wert.
Eine von dieser Seite kopierte Nonce ist bei jeder Anfrage dieselbe und schützt in Produktion also nichts. Echte Deployments erzeugen sie im Servercode, wie unten gezeigt.
So funktioniert eine Policy mit Nonces
Mit script-src 'nonce-…' führt der Browser ein Skript nur aus, wenn sein Attribut nonce mit dem Wert im Header genau dieser Antwort übereinstimmt. Ihre eigenen <script>-Tags bekommen das Attribut aus Ihren Templates. Markup, das ein Angreifer über eine XSS-Lücke einschleust, kennt den Wert nicht, weil er sich bei jedem Seitenaufruf ändert, und der Browser verweigert die Ausführung.
Drei Details zählen in der Praxis:
- Der Wert wird als Text verglichen. Kopieren Sie ihn exakt,
=eingeschlossen, und behalten Sie die einfachen Anführungszeichen um'nonce-…'im Header, aber nicht im Attribut. - Browser verbergen das Attribut. Sobald die Seite geladen ist, liefert
getAttribute("nonce")einen leeren String, und CSS-Selektoren sehen den Wert nicht, was einige Exfiltrationstricks verhindert. Skripte, die ihn brauchen, lesen stattdessen die Eigenschaftnonce. 'strict-dynamic'erlaubt einem vertrauenswürdigen Skript mit Nonce, weitere Skripte zu laden, ohne dass jedes eine eigene Nonce braucht. Es ist der übliche Begleiter von Nonces in einer modernen Policy, und damit ignoriert der Browser Host-Allowlists wiehttps:.
Die Policy lässt sich auch in einem Tag <meta http-equiv="Content-Security-Policy"> ausliefern; Nonces funktionieren auch dort, manche Direktiven wie frame-ancestors dagegen nicht.
Eine Nonce pro Antwort erzeugen
Der Server erzeugt für jede Anfrage 16 Zufallsbytes, setzt sie in den Header und gibt denselben Wert an das Template weiter. In Node.js, ganz ohne Framework:
const crypto = require("crypto");
const http = require("http");
http.createServer((req, res) => {
const nonce = crypto.randomBytes(16).toString("base64");
res.setHeader("Content-Security-Policy",
`script-src 'nonce-${nonce}' 'strict-dynamic'; object-src 'none'; base-uri 'none'`);
res.setHeader("Content-Type", "text/html; charset=utf-8");
res.end(`<script nonce="${nonce}" src="/app.js"></script>`);
}).listen(8080);
In Python liefert base64.b64encode(secrets.token_bytes(16)).decode() dieselbe Art von Wert; Frameworks mit CSP-Middleware stellen ihn meist als Template-Variable bereit. Was Sie auch verwenden: Achten Sie darauf, dass ein Cache vor dem Server das HTML nicht mit einer Nonce speichert und an jeden Besucher ausliefert. Wird der Seiteninhalt gecacht, während sich der Header ändert, bricht jedes Skript; werden beide gecacht, wiederholt sich die Nonce für alle.
Nonces, Hashes und SRI
Eine Nonce gibt ein Script-Tag für eine Antwort frei. Ein CSP-Hash gibt ein bestimmtes Inline-Skript dauerhaft frei: 'sha256-…' ist das Base64-SHA-256 des exakten Texts zwischen <script> und </script>. Für <script>alert('Hello');</script> lautet es:
script-src 'sha256-gKHd+pSZOJ3MwBsFalomyNobAcinjJ44ArqbIKlcniQ='
Hashes eignen sich für statische Websites und Inline-Snippets, die sich nie ändern; berechnen Sie sie mit dem Tool SHA-256 in Base64 und achten Sie auf Leerraum, denn schon ein zusätzliches Leerzeichen ändert den Hash. Subresource Integrity ist ein dritter Mechanismus mit denselben Base64-Digests: integrity="sha384-…" an einem <script src> lässt den Browser die heruntergeladene Datei selbst prüfen. Der SRI-Hash-Generator baut solche Tags.
Häufige Fragen
Wie lang sollte eine CSP-Nonce sein?
Die CSP-Spezifikation verlangt mindestens 128 Bit Zufall vor dem Kodieren, also 16 Bytes oder 24 Base64-Zeichen. Länger ist in Ordnung; kürzer schwächt den Schutz.
Kann ich dieselbe Nonce auf jeder Seite wiederverwenden?
Nein. Eine feste Nonce ist in Ihrem HTML sichtbar, ein Angreifer, der Markup einschleusen kann, kopiert sie also einfach in sein eigenes <script>-Tag. Erzeugen Sie für jede HTTP-Antwort eine neue.
Kann eine statische Website CSP-Nonces nutzen?
Nur wenn etwas davor jede Antwort umschreibt, etwa eine Edge Function, die eine frische Nonce einsetzt. Rein statisches Hosting liefert allen dieselben Bytes; nehmen Sie stattdessen Skript-Hashes ('sha256-…') oder externe Dateien von 'self'.
Sind URL-sichere Zeichen in einer Nonce erlaubt?
Ja. Die CSP-Grammatik akzeptiert beide Base64-Alphabete: Buchstaben, Ziffern, +, /, - und _, mit bis zu zwei = am Ende. Standard-Base64 ist die übliche Wahl.