Web-Sicherheit

Nonce

Definition

Eine Nonce ist ein grundsätzlich zufälliger Wert, der nur einmal verwendet und einem Austausch hinzugefügt wird, damit er sich weder wiederholen noch fälschen lässt. In WordPress ist eine Nonce ein Token, das an eine Aktion, einen Benutzer und seine Sitzung gebunden ist, 12 bis 24 Stunden gilt und vor allem gegen CSRF-Angriffe schützt.

Nonce, Web-Sicherheit

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 Attribut nonce der 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.
Schema in fünf Schritten: WordPress erzeugt eine Nonce, die an Aktion, Benutzer, Sitzung und ein 12-Stunden-Fenster gebunden ist; der Benutzer sendet das Formular mit dem Token ab; eine auf einer anderen Website gefälschte Anfrage kommt ohne gültiges Token an; check_admin_referer oder wp_verify_nonce lehnt sie ab; current_user_can prüft zuletzt die Berechtigung, bevor gehandelt wird
Die Nonce belegt, dass die Anfrage von einer Seite der Website kommt; die Berechtigung wird getrennt geprüft.

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, und wp_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.

Weiterlesen

  • Artikel Schwachstellen in WordPress-Plugins in Zahlen

Quellen

  1. WordPress Common APIs Handbook: Nonces (externer Link, öffnet in neuem Tab)
  2. WordPress Developer Resources: wp_create_nonce() (externer Link, öffnet in neuem Tab)
  3. MDN: Nonce (glossaire) (externer Link, öffnet in neuem Tab)
  4. OWASP: Cross-Site Request Forgery Prevention Cheat Sheet (externer Link, öffnet in neuem Tab)

Alle Definitionen

WordPress-Sicherheit ohne Lärm

Eine E-Mail, wenn es wichtig ist: neu beobachtete Angriffe, Updates des Plugins und praktische Anleitungen. Kein Spam, Abmeldung mit einem Klick.

Starte kostenlos und wechsle zu Pro, wenn du so weit bist

Die kostenlose Version versteckt WordPress bereits und verschiebt die Anmeldeseite. Pro ergänzt Aliasse, Zwei-Faktor-Authentifizierung und Überwachung.