Das Wort steht für „number used once“, also eine Zahl, die nur ein einziges Mal verwendet wird. In der Kryptografie beschreibt MDN eine Nonce als beliebigen Wert, der in einer Kommunikation nur einmal vorkommt: Er verhindert, dass eine abgefangene Nachricht erneut abgespielt wird, garantiert, dass eine Antwort frisch ist, oder bringt Zufall in eine Berechnung. Im Web bezeichnet der Begriff allerdings zwei recht unterschiedliche Dinge, die du besser auseinanderhältst: die „echte“ kryptografische Nonce und die WordPress-Nonce.
Wofür Nonces im Web eingesetzt werden
- In Protokollen: Der Handshake von TLS und viele Authentifizierungsverfahren enthalten zufällige Einmalwerte, damit sich eine aufgezeichnete Unterhaltung nicht einfach wiederholen lässt.
- In einer Content Security Policy: Der Server erzeugt für jede Antwort einen Zufallswert und setzt ihn in die Direktive
script-src 'nonce-…'sowie in das Attributnonceder erlaubten Skripte. Eine strikte CSP führt nur Skripte mit dem richtigen Wert aus. MDN betont, dass er sich bei jeder Antwort ändern und unvorhersehbar bleiben muss. - Gegen gefälschte Anfragen: Ein geheimes Token in Formularen belegt, dass die Anfrage wirklich von einer Seite der Website stammt, und blockiert so CSRF-Angriffe. Das ist die Hauptaufgabe der WordPress-Nonces.
WordPress-Nonces: eigentlich keine Nonces
Die offizielle WordPress-Dokumentation gibt es selbst zu: Ihre Nonces sind weder Zahlen noch Einmalwerte. Die Funktion wp_create_nonce() berechnet einen zehnstelligen Hash aus der angeforderten Aktion, der Benutzer-ID, dem Sitzungstoken und einem Zeitfenster. Dafür nutzt sie die Schlüssel NONCE_KEY und NONCE_SALT aus der wp-config.php. Deshalb ist ein eindeutiger Salt wichtig.
- Lebensdauer: standardmäßig ein Tag, aufgeteilt in zwei Fenster von je 12 Stunden. Je nach Erzeugungszeitpunkt bleibt eine Nonce also 12 bis 24 Stunden gültig. Der Filter
nonce_lifeändert diese Dauer. - Wiederverwendbar: WordPress prüft nicht, ob eine Nonce nur einmal benutzt wurde. Innerhalb ihrer Gültigkeit schützt sie also nicht vor einer Wiederholung.
- Abgemeldete Besucher: Ihre Benutzer-ID ist 0, daher können alle anonymen Besucher für dieselbe Aktion dieselbe Nonce erhalten.

Für WordPress: Nonces richtig einsetzen
Für Theme- und Plugin-Entwickler lässt sich die Regel auf drei Funktionen und eine Berechtigungsprüfung herunterbrechen:
// Im Formular
wp_nonce_field( 'delete_post_' . $post_id );
// Bei der Verarbeitung
check_admin_referer( 'delete_post_' . $post_id );
if ( ! current_user_can( 'delete_post', $post_id ) ) {
wp_die( 'Du darfst das nicht tun.' );
}
check_admin_referer()prüft im Adminbereich die Nonce und den Referrer,check_ajax_referer()prüft bei AJAX-Anfragen nur die Nonce, undwp_verify_nonce()deckt die übrigen Fälle ab.- Benenne die Aktion präzise (einschließlich der Objekt-ID), statt einen allgemeinen Namen für die ganze Website zu verwenden.
- Verlass dich bei der Autorisierung nie auf die Nonce: Die Dokumentation verlangt, jede Funktion mit
current_user_can()abzusichern.
Häufige Fehler
Ein guter Teil der jedes Jahr gemeldeten Plugin-Schwachstellen geht auf eine fehlende Nonce oder eine vergessene Berechtigungsprüfung zurück, wie unser Beitrag zu den Zahlen der WordPress-Plugin-Schwachstellen zeigt. Der typische Fall: Eine AJAX-Aktion prüft die Nonce, aber nicht die Rechte des Benutzers. Eine Nonce kann jedoch im Code einer öffentlichen Seite auftauchen; ist sie die einzige Hürde, kann manchmal schon ein Abonnent eine Administratoraktion auslösen, was zu einer Rechteausweitung führt. Unser Leitfaden zu Rollen und Berechtigungen in WordPress erklärt das Prinzip der minimalen Rechte.
Eine weitere Falle: Eine Seite, die länger als 12 bis 24 Stunden im Cache liegt, liefert eine abgelaufene Nonce aus, und das Formular scheitert mit der Meldung „Der Link, dem du gefolgt bist, ist abgelaufen.“ Schließe Seiten mit Formularen für angemeldete Benutzer vom Cache aus.