Artikel vom 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. Das gleiche gilt auch für das wpSEO Plugin: Nicht nur optisch, auch technisch passt sich das Plugin dem WordPress 2.7 an.
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.
[Der Autor] Sergej Müller ist enthusiastischer Software Engineer mit Schwerpunkten Webentwicklung und WordPress. Seit 2007 programmiert und vertreibt er wpSEO, das weltberühmte und patentierte SEO-Plugin für WordPress-Blogs.
Jubiläumsverlosung: wpSEO wird zwei und verlost iTunes Karten
Twitter und Bit.ly in WordPress: Plugin wpTwitBox 0.5 freigegeben
Social Werkzeuge