Auch Entwickler brauchen Platz zum Spielen

20. November 2008 /

Plugin-Entwicklung unter WordPress: AJAX-Anfragen absichern

Ambitioniert und mit reichlich Kundenfeedback arbeitet das WordPress-Team an dem Motor der zukünftigen Version 2.7. Aber auch Entwickler der Plugins geben sich überdurchschnittlich viel Mühe, existierende WordPress-Erweiterungen an den kommenden Release anzupassen, indem neuartige Funktionen zum Bestandteil der Software werden.

AJAX-Ansätze in WordPress
Eine der Neuerungen im Administrationsbereich des SEO-Plugins ist die praktische Möglichkeit gruppierte Einstellungen für mehr Übersichtlichkeit – ähnlich der Boxen im Dashboard – ein- und zuklappen. Die Speicherung der Zustände übernimmt ein AJAX-Request in Form eines minimalistischen jQuery-Scripts.

An sich nichts Weltbewegendes, da WordPress bereits seit längerer Zeit auf AJAX-basierte Lösungen zurückgreift. Im nachfolgenden Beispiel wird deutlich und verständlich gezeigt, wie per AJAX gestellte POST- oder GET-Requests abgesichert werden können, um Missbrauch weitgehend zu unterbinden. „WordPress Nonce„-Implementierung liegt dabei zu Grunde, welche nach dem Prinzip der Verifizierung einer bereits vergebenen Prüfsumme funktioniert.

Sicherheit für Formulare
Die Plugin- und Theme-Entwickler kennen bereits die WordPress-Funktion wp_nonce_field, die ein beliebiges Formular um ein Input-Hidden-Tag mit generierter Prüfsumme erweitert. Mithilfe der Partnerfunktion check_admin_referer wird diese Prüfzahl vor dem Auswerten des Formulars auf die Richtigkeit geprüft – die bestandene Prüfung ist ein Garant für eine nicht manipulierte Übergabe der Daten.

Datenstrom per AJAX: Mehr Vertrauen schaffen
Für Absicherung der AJAX-Jobs kommt die eben erwähnte Funktion wp_nonce_field nicht in Frage, da diese als Ausgabe einen XHTML-Code generiert, welcher an dieser Stelle fehl am Platze ist, da AJAX ja bekanntlich per JavaScript gesteuert wird. Zur Hilfe springt die Anweisung wp_create_nonce mit ihrer unformatierten Prüfsumme als Output ein, die für spätere Verifizierung dem Parameter _ajax_nonce manuell zugewiesen wird.

Die benutzerdefinierte Funktion auf der anderen Seite der Leitung, die die eigentliche Aktion ausführt (übergebene Werte speichern, Daten abfragen, usw.), prüft die gesendeten Daten mit extra für AJAX-Ansätze eingeführter Funktion check_ajax_referer auf ihre Vertrauenswürdigkeit: Ist der Check fehlgeschlagen, so bricht das Script mit einer Fehlermeldung ab.

<script type="text/javascript">
  $.post(
    '<?php echo admin_url("admin-ajax.php") ?>',
    {
     'action': 'set_toggle_status',
     '_ajax_nonce': '<?php echo wp_create_nonce("wp_seo_ajax") ?>',
     'set_toggle_id': postbox.attr('id'),
     'set_toggle_status': postbox.is('.closed')
    }
  );
</script>

Beispielcode eines AJAX-Request im Admin-Bereich

add_action('wp_ajax_set_toggle_status', 'set_toggle_status');

Hinzufügen der Action für den Aufruf der eigentlichen Funktion

function set_toggle_status() {
  check_ajax_referer('wp_seo_ajax');
  
  // Ist die Prüfung bestanden, wird hier weiter ausgeführt
  // Jetzt speichern, auslesen etc.
}

Definition der Action-Funktion mit der Prüfung des AJAX-Referer

Hinweis
Beim Aufruf der Funktion wp_create_nonce wird als Parameter eine Art Kennung bzw. Key übergeben (im Beispiel ist es „wp_seo_ajax“), auf die sich dann die Abfragefunktion check_ajax_referer bezieht. Diese Kennung kann also frei definiert werden und sollte nach Möglichkeit einmalig sein.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.