Veröffentlicht am

„nonce“-Verifizierung von auto-generierten „settings_fields“

Mit der Funktion wp_verify_nonce hat WordPress bereits eine einfach zu nutzende Funktion, Nonces zu verifizieren. Bei selbst angelegten Nonces geht das auch recht einfach über wp_nonce_field, nicht jedoch innerhalb von settings_fields.

Letzteres erstellt untere anderem selbst über wp_nonce_field ein entsprechendes Nonce-Feld, wodurch man allerdings nicht direkt weiß, wie dessen action-Name lautet.

Exkurs Nonces: Ein Nonce-Feld wird genutzt, um zu validieren, ob die übertragenen Formulardaten wirklich aus dem Formular kommen, von dem sie kommen sollen bzw. zu kommen scheinen. Dabei steht „Nonce“ für „number used once“ und ist eine aus den Formularfeldern generierte Zeichenkette. Diese ist für eine bestimmte Zeit gültig, d. h. man erhält bei der erneuten Generierung auf Basis derselben Formularfeldern auch dieselbe Nonce. Dadurch kann man überprüfen, ob das Formular manipuliert wurde, da dann die Nonce bei der Prüfung abweichen würde. Mehr Informationen dazu gibt es in den WordPress Developer Resources bzw. im WordPress Codex.

Während man sich über wp_nonce_field den Name der action selbst aussuchen kann, weil man ihn angeben muss, ist das bei settings_fields nicht der Fall. Dieser wird allerdings benötigt, um ihn bei der Verwendung der übertragenen Daten über wp_verify_nonce zu verifizieren, da der zweite Parameter dieser Funktion die action sein muss, die man bei der Generierung per wp_nonce_field angegeben hat.

Erst im Quellcode von settings_fields erkennt man, dass die action eine Zusammensetzung zweier Parameter ist: der erste Teil ist die $option_group, welche man an settings_fields übergibt und der zweite Teil ist einfach die Zeichenkette -options.

Eine Verifizierung könnte demnach folgendermaßen aussehen (kein vollständig funktionaler Code):

<?php
function output_form() {
	// print the settings fields including the nonce
	settings_fields( 'my_option_group' );
	// additional form data …
}
// later, verify the nonce
function form_update() {
	if ( ! isset( $_POST['_wpnonce'] )
		|| ! wp_verify_nonce( sanitize_key( $_POST['_wpnonce'] ), 'my_option_group-options' )
	) {
		// do stuff if the request is not what it looks like
	}
}

Zuerst wird demnach innerhalb der Ausgabe eines Formulars über settings_fields( 'my_option_group' ) die notwendigen Felder hinzugefügt, darunter auch die Nonce.

Sobald das Formular dann abgesendet wird (form_update), wird dann zuerst überprüft, ob die notwendigen Parameter vorhanden sind, also die Nonce (_wpnonce).

Sofern vorhanden, werden dieser Wert an wp_verify_nonce übergeben, zusammen mit dem Namen, den wir bei settings_fields angegeben haben und der Zeichenkette -options, wie oben beschrieben.

… und schon ist das Formular zumindest an dieser Stelle geschützt. 🔐

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.