“Nonce“ bedeutet: „Number used once“. Eine Nummer also, die nur einmalig Verwendung findet.
In WordPress gibt es mehrere Sicherheitsstufen. Wenn Sie beispielsweise einen Artikel löschen wollen müssen Sie:
- Eingeloggt sein,
- die Rechte zum Löschen eines Artikels besitzen,
- die Nonce muss stimmen und
- der Referrer muss der richtig sein.
Man könnte meinen, dass das „Eingeloggt sein“ und das Besitzen der erforderlichen Rechte bereits Sicherheit genug ist. Aber das ist leider nicht der Fall. Stellen Sie sich einfach vor, ein Angreifer schickt Ihnen einen Link zum Löschen eines Artikels per E-Mail. Der Link zeigt auf Ihre eigene Website und wird vielleicht sogar mit einem URL-Verkürzer (wie bit.ly) verschleiert. Sie sehen als nicht auf Anhieb, dass Sie auf Ihre eigene Website weitergeleitet werden.
Nun klicken Sie auf den Link und ein Artikel Ihrer WordPress-Installation wird gelöscht. Der Angreifer hat nichts getan außer Ihnen einen Link zu schicken. Und WordPress konnte nichts tun, da Sie eingeloggt waren und sogar die erforderlichen Rechte hatten.
Um dem vorzubeugen hat WordPress die Nonces eingefügt. Eine Nonce wird immer dann errechnet und mitgeschickt wenn eine Aktion durchgeführt werden soll. Zum Beispiel beim Löschen eines Artikels oder beim Speichern von Daten. Vor der eigentlichen Aktion wird zuerst geprüft ob eine Nonce gültig ist. Ist sie das nicht, wird die jeweilige Aktion nicht durchgeführt.
Im Umkehrschluss bedeutet das: Nonces existieren auch, damit der Benutzer vor sich selbst geschützt wird. Denn er kann zum Beispiel nicht mehr versehentlich auf Links klicken, auf die er nicht klicken wollte.
WordPress erstellt eine Nonce individuell
- pro Benutzer,
- pro Aktion (löschen, speichern, etc.),
- für ein Objekt (einen Artikel, einen Link, etc.) und
- für eine maximale Zeit von 24 Stunden.
Ein Angreifer müsste also den Nonce an sich, den Benutzernamen, die Aktion und das Objekt herausfinden um überhaupt einen entsprechenden Link zu erstellen. Zusätzlich müsste er Sie innerhalb von 24 Stunden dazu bewegen, auf den Link zu klicken. Ziemlich unwahrscheinlich das ihm das alles gelingt.
Beispiel:
Einen Nonce erstellen
WordPress bietet mehrere Möglichkeiten eine Nonce zu erstellen. Die einfachste Funktion lautet wp_create_nonce()
.
Nonce als String
<?php
function wp_create_nonce( $action = -1 ) {
...
}
?>
Wobei gilt:
Nonce in einer URL
Die nachfolgende Funktion hängt eine Nonce direkt an eine bereits definierte URL an:
<?php
function wp_nonce_url( $actionurl, $action = -1, $name = '_wpnonce' ) {
...
}
?>
Dabei gilt:
Nonce als Formular-Feld
Auch das direkte Einbinden von Nonces in bestehende Formulare ist möglich. Dazu wird folgende Funktion benutzt:
<?php
function wp_nonce_field( $action = -1, $name = "_wpnonce", $referer = true , $echo = true ) {
...
}
?>
Dabei gilt:
Einen Nonce überprüfen
Damit die Nonces nun nicht übergangen werden, müssen diese noch auf Gültigkeit überprüft werden. Auch hier gibt es mehrere Möglichkeiten.
wp_verify_nonce
<?php
function wp_verify_nonce( $nonce, $action = -1 ) {
...
}
?>
Dabei gilt:
check_admin_referer()
Testet ob die aktuelle Anfrage eine gültige Nonce enthält und/oder ob sie von einer Administrationsseite kam.
<?php
function check_admin_referer( $action = -1, $query_arg = '_wpnonce' ) {
..
}
?>
Dabei gilt:
check_ajax_referer()
Auch Ajax-Aufrufe sollten mit einer Nonce versehen und geprüft werden. WordPress bietet folgende Funktion:
<?php
function check_ajax_referer( $action = -1, $query_arg = false, $die = true ) {
...
}
?>
Dabei gilt:
Nonce Beispiel-Plugin
Wir benutzen das Beispiel aus Kapitel 4.3.9 und erweitern es: