Begriffe vorab
- Sanitizing: Eingaben bereinigen, bevor sie verarbeitet oder gespeichert werden.
- Escaping: Ausgaben so kennzeichnen, dass sie nicht als Code gelesen werden.
- XSS: Einschleusen von Skript in Seiten.
- CSRF: untergeschobene Anfragen im Namen angemeldeter Nutzer.
- SQL-Injection: Einschleusen von Datenbankbefehlen.
Sicherheit folgt in WordPress einem festen Muster: Eingaben validieren und bereinigen, Ausgaben escapen, Aktionen per Nonce absichern und Berechtigungen prüfen.
Sanitizing und Validierung (Eingabe)
Bereinige Daten, bevor du sie speicherst oder verwendest.
sanitize_text_field(): einfacher Textsanitize_email(),esc_url_raw(),absint()wp_kses_post(): erlaubt nur sicheres HTML wie in Beiträgen
Escaping (Ausgabe)
Escape so spät wie möglich, direkt bei der Ausgabe, passend zum Kontext.
echo '<a href="' . esc_url( $url ) . '" title="' . esc_attr( $titel ) . '">' . esc_html( $text ) . '</a>';
esc_html()für Text im HTMLesc_attr()für Attributwerteesc_url()für URLsesc_js()für Inline-JavaScript-Strings
Nonces
Nonces schützen vor Cross-Site-Request-Forgery (CSRF), indem sie bestätigen, dass eine Anfrage aus deinem Formular oder Link stammt.
// Formular
wp_nonce_field( 'meinpraefix_speichern', 'meinpraefix_nonce' );
// Verarbeitung
if ( ! isset( $_POST['meinpraefix_nonce'] ) || ! wp_verify_nonce( $_POST['meinpraefix_nonce'], 'meinpraefix_speichern' ) ) {
wp_die( 'Ungültige Anfrage' );
}
Ein Nonce ist keine Berechtigungsprüfung. Er beweist die Herkunft, nicht das Recht des Nutzers.
Capabilities
if ( ! current_user_can( 'manage_options' ) ) {
wp_die( 'Keine Berechtigung' );
}
Typische Capabilities sind manage_options (Einstellungen), edit_posts und edit_post (mit Post-ID, für einen konkreten Beitrag).
Datenbank
Eigene SQL-Abfragen laufen immer über $wpdb->prepare() mit Platzhaltern %s (String), %d (Integer) und %f (Float).
global $wpdb;
$row = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->posts} WHERE ID = %d", $id ) );
Vertraue nie
$_GET,$_POSToder$_REQUEST. Bereinige mitwp_unslash()und den passenden Sanitize-Funktionen.
Welche Regel gegen welchen Angriff?
- Escaping schützt vor XSS: Ein eingegebenes Skript wird als Text angezeigt statt ausgeführt.
- Nonce schützt vor CSRF: Eine Anfrage ohne gültiges Token wird abgewiesen.
- Prepared Statements (
$wpdb->prepare()) schützen vor SQL-Injection. - Capability-Prüfung verhindert, dass Nutzer Aktionen ausführen, für die ihnen das Recht fehlt.
Ein Beispiel
Ein Formular speichert einen Namen. Ohne Escaping könnte jemand als Namen ein Skript eintragen, das später jedem Besucher ausgeführt wird. Mit esc_html() an der Ausgabestelle wird daraus harmloser Text. Zusätzlich sorgt die Nonce-Prüfung dafür, dass das Formular nicht von einer fremden Seite abgeschickt werden kann.
Nie darauf verlassen, dass Eingaben „schon stimmen“. Alles, was von außen kommt – auch aus Cookies, URLs und REST-Anfragen – gilt als nicht vertrauenswürdig.
Prüfstatus: Belegt (Stand 1. Oktober 2026): Jahreszahlen, Zahlen, Namen und Quellenangaben dieser Lektion, soweit die Quellenliste sie nennt, wurden gegen Primärquellen geprüft. Nicht einzeln belegt: erklärende Darstellung nach Lehrbuchstand und Quellen, die in der Liste als „allgemeine Referenz“ markiert sind. Codebeispiele sind nur auf Syntax geprüft, nicht in WordPress ausgeführt.
Quellen
- WordPress Developer Resources – „Security“ (Data Validation, Sanitizing, Escaping; developer.wordpress.org/apis/security/) (allgemeine Referenz, nicht Zeile für Zeile geprüft)
- WordPress Developer Resources – „Nonces“ (developer.wordpress.org/apis/security/nonces/) (allgemeine Referenz, nicht Zeile für Zeile geprüft)