Was sind Nonces?
Wer davon noch nie gehört hat möge beruhigt sein: Man hat mit der Thematik und dem Wort selten etwas zu tun!
Im WP-Kontext sind Nonces eine zufällige Aneinanderreihung von Zahlen und Buchstaben, die zwar mehrmals verwendet werden (im Gegensatz zur üblichen Implementierung von Nonces – Number used once), aber ein klar definiertes Ablaufdatum haben.
Wie bereits im Artikel WordPress Sicherheit bei Formulareingaben und AJAX Aufrufen – verwendet Nonces! beschrieben wurde, sollen Nonces dabei helfen, URLs und Formulare auf Websites vor missbräuchlicher Benutzung und anderem Unfug zu schützen.
Erstellung
Wie bei vielen Dingen, nimmt WordPress sehr viel Arbeit ab! Auch hier bei der Arbeit mit Nonces!
URLs
werden mit wp_nonce_url( $actionurl, $action, $name ); aufgerufen.
- $actionurl ist die URL, die wir mit der Nonce „absichern“ wollen.
- required; Default: None
- $action ist der Name der action, die wir frei wählen können.
- optional; Default: -1
- $name ist der Name der so generierten Nonce.
- optional; Default: _wpnonce
Als Rückgabewert erhalten wir eine bereinigte URL mit zusätzlicher Nonce. Diese sieht in etwa so „http://example.com/wp-admin/post.php?post=123&action=trash&_wpnonce=b192fc4204“ aus.
Forms
werden mit wp_nonce_field( $action, $name, $referer, $echo ); aufgerufen. Diese Funktion generiert uns bis zu zwei hidden input Elemente.
- $action definiert den Namen der action.
- optional, aber empfohlen; Default: -1
- $name ist der Name der so generierten Nonce.
- optional. Default: _wpnonce
- $referer gibt an, ob ein zusätzliches hidden input Element erstellt werden soll, das den Output der Funktion wp_referer_field beinhaltet.
- optional; Default: true
- $echo gibt an, ob die so erstellten inputs im HTML ausgegeben werden.
- optional; Default: true
Als Rückgabewert erhalten wir ein oder zwei hidden input Elemente, wenn $referer true ist.
Validierung
Das Thema Validierung könnte ein bisserl komplizierter sein.
Auch, weil die Parameter nicht so gut benannt sind und Verwirrung stiften könnten. Hier also der Versuch, der Entwirrung:
Allgemein
check_admin_referer( $action, $name ); überprüft sowohl die Nonce als auch den $referer.
- $action ist der Name der action, die wir frei wählen können.
- optional; Default: -1
- $name ist der Name der so generierten Nonce.
- optional; Default: _wpnonce
AJAX
check_ajax_referer( $action, $query_arg, $die ); überprüft nur die Nonce im Zuge eines AJAX-Requests.
- $action ist der Name der action, die wir frei wählen können.
- optional; Default: -1
- $query_arg ist der Name der so generierten Nonce
- optional; Default: false
- $die gibt an, ob das script angehalten werden soll, wenn die Überprüfung fehlschlägt
- optional; Default: true
Basic
wp_verify_nonce( $nonce, $action ); überprüft nur die Nonce.
- $nonce ist der Name der Nonce, die überprüft werden soll.
- required; Default: None
- $action ist der Name der action.
- optional; Default: -1
Eine einfache Überprüfung könnte z.B. so aussehen:
Weiterführende Informationen:
- https://codex.wordpress.org/WordPress_Nonces
- https://developer.wordpress.org/reference/functions/wp_nonce_url/
- https://developer.wordpress.org/reference/functions/wp_nonce_field/
- https://developer.wordpress.org/reference/functions/check_admin_referer/
- https://developer.wordpress.org/reference/functions/check_ajax_referer/
- https://developer.wordpress.org/reference/functions/wp_verify_nonce/
Update vom 7. Mai 2021:
Anpassungen an den Links zum Codex.
Der alte Codex haucht sein Leben aus, developer.wordpress.org übernimmt! Aber es ist alles noch nicht abgeschlossen, daher gelten manche Links im Codex noch. Zudem dort auch Mehrsprachigkeit vorhanden ist.
Update vom 10. Juli. 2018:
Die Wikipedia kennt jetzt das Wort Nonce
In der Wikipedia gibt es jetzt eine Erklärung zum Begriff „Nonce“:
https://de.wikipedia.org/wiki/Nonce