Frisch notiert!
Die neusten Artikel aus unserem Blog.

Für WordPress Entwickler: Sicherheit durch Validierung, Sanitization und Escaping gewährleisten

von Adrian Lambertz / Zuletzt aktualisiert am 18/08/2016 / Wordpress / 0

Dein Code funktioniert, aber ist er auch sicher vor Angriffen? Werden Benutzereingaben validiert? Werden Sie beim Speichern in der Datenbank bereinigt (sanitized)? Und werden sie bei Bedarf auch escaped im Frontend ausgegeben?

Gerade für Optionsseiten oder Meta-Boxen für Beiträge (oder Seiten z.B.) in denen der Benutzer eigene Inhalte speichern kann (also bei der Eingabe der Inhalte), spielen Validierung und Sanitization eine große Rolle.

Escaping wird erst für die Ausgabe der Inhalte in deinem Theme oder Plugin wichtig.

Eingaben validieren und bereinigen (sanitization)

Benutzereingaben sollten niemals ohne irgendeine Überprüfung oder Bearbeitung einfach so in die Datenbank geschrieben werden. Wie du mittlerweile bestimmt schon gemerkt hast, gibt es für die Eingabe der Inhalte zwei wichtige Begriffe, die in keinem WordPress-Entwicklerwortschatz fehlen dürfen: Validierung und Sanitization.

Merke: Egal was man dir sagt oder was auch immer passiert: vertraue niemals dem Benutzer und auf das, was er eingibt!

Validierung

Ein kleines Beispiel zur Veranschaulichung. Wir haben folgendes Input Feld:

<input type="number" name="plz" id="plz" />

Du verlangst von dem Benutzer eine Postleitzahl. Als schlauer Entwickler sagst du dir „Na klar, ich setze den Typ des Input Feldes auf Number!“. Klar, richtig – ABER: der Typ „number“ ist ein HTML5 Attribut und wird von IE9 abwärts nicht unterstützt bzw. als Typ Text interpretiert. Somit ist es nicht mehr sicher, dass wirklich nur noch Nummern eingegeben werden (unabhängig von der Browserkompatibilität kann man das Feld auch so austricksen). Aus diesem Grund solltest du als guter Entwickler dann vor dem Speichern prüfen, ob es sich auch wirklich um einen numerischen Wert handelt:

<?php $plz = (intval( $_POST['plz'] )) ? (int)$_POST['plz'] : ''; ?>

intval() prüft ob der Wert komplett numerisch ist und falls nicht, gibt sie 0 (false) aus. Das nutzen wir in unserer einzeiligen if-Abfrage und speichern die Eingabe nur in die $plz Variable, wenn sie numerisch ist. Ist sie es nicht, wir $plz als leere Variable festgelegt.

Über die if-Abfragen kann man so natürlich auch Fehler zurückgeben und die Verarbeitung des Scriptes komplett stoppen.

Bereinigung (Sanitization)

Sanitization bereinigt UND validiert die Benutzereingaben. Veranschaulichen wir das wieder an einem kleinen Beispiel:

<input type="text" name="untertitel" id="untertitel" />

Du erstellst eine zusätzliche Eingabemaske für einen Untertitel pro Post. Dort kann der Benutzer später alles Mögliche reinsetzen. Dennoch musst du dir sicher sein, dass er keinen Schadcode einschleusen kann. Selbst wenn er es versucht, sollte durch das Bereinigen der Schadcode unbrauchbar werden, da er z.B. von <script> Tags, Kommentaren etc. bereinigt wird, oder?

<?php $untertitel = sanitize_text_field( $_POST['untertitel'] ); ?>

In die Variable $untertitel wird nun die bereinigte und validierte Eingabe des Benutzers gespeichert. Diese kann nun weiterverarbeitet werden (in die Datenbank speichern). Wenn ich hier von Validierung spreche, ist diese natürlich nicht die selbe, wie wenn ich selber prüfe, ob eingegebene Werte korrekt sind etc.

Die Bereinigung bewirkt, dass letztendlich valide Eingaben in die Datenbank kommen. Mit den Sanitization Funktionen habt ihr so NICHT direkt die Möglichkeit, beispielsweise die Script-Ausführung zu stoppen oder Fehler auszugeben.

Im WordPress Codex kannst du nachlesen, welche Sanitization Funktionen es gibt.

Ausgaben escapen

Selbst wenn wir uns nun halbwegs sicher sein können, dass die Inhalte korrekt in der Datenbank stehen, gilt dies noch lange nicht für die Ausgabe innerhalb deines Templates.

Hier hilft uns das so genannte Escaping.

Sicher denkst du dir nun „Warum soll ich denn jetzt noch escapen, wenn die Inhalte doch sowieso schon validiert und bereinigt wurden?“.

Warum? Ganz einfach: du sicherst dein Plugin oder Theme mehrfach ab. Frei nach dem Motto „Doppelt gemoppelt hält besser“ (in diesem Fall dreifach gemoppelt…) sollte man einfach alle Möglichkeiten ausschöpfen.

Ausserdem schützt du so den Benutzer vor seinen eigenen Fehlern. Nocheinmal ein kleines Beispiel: du erstellst eine kleine Meta-Box für eine Bildunterschrift, die in das ALT-Attribut des dazugehörigen Bildes eingefügt wird.

Hier schreibt der Benutzer nun, unwissend wie er ist, folgendes rein:

Das Bild des Gasthauses "Zum tänzelnden Pony"

Was wird passieren? Richtig – das ALT Attribut wird mitten in der Ausgabe wieder durch das Anführungszeichen geschlossen. Das ist ein dicker Fehler und zerschießt im schlimmsten Fall das gesamte Websitelayout.

Hier kommt Escaping ins Spiel. Um genau diese Fehler zu vermeiden hat WordPress einige nützliche Funktionen im Gepäck:

<img src="nettesbild.jpg" alt="<?php echo esc_attr($bildunterschrift); ?>" />

esc_attr() codiert die Anführungszeichen so, dass sie korrekt ausgegeben werden. Ergebnis: kein Fehler im Code und die Website sieht sauber aus.

Neben esc_attr() gibt es noch esc_html(), esc_url(), esc_js(). Schaue hier im WordPress Codex nach, wofür sie genau da sind.

Beachte: Fast alle WordPress Funktionen wie the_content(), the_title() etc. machen schon Gebrauch von Escaping bei der Ausgabe, validieren und sanitizen den Inhalt in der Eingabe.

Ein Zusatztipp für das Escaping

Nutze die Escape Funktionen im Code so spät wie möglich. Idealerweise direkt bei der Ausgabe.

Das u.A. aus folgenden Gründen:

  • Irgendetwas kann in die Verarbeitung deines Codes pfuschen und vorher escapte Variablen wieder manipulieren, bevor sie ausgegeben werden.
  • Der Code wird später leichter zu lesen sein, wenn man weiss, dass das Escaping immer direkt in der Ausgabe stattfindet.

Also lieber so arbeiten:

<?php
// so kann man arbeiten, ist aber nicht zu empfehlen
$src = esc_url( $src );
$alt = esc_attr( $alt );
echo '<img src="'.$src.'" alt="'.$alt.'" />';

// das ist viel besser!
echo '<img src="'.esc_url( $src ).'" alt="'.esc_attr( $alt ).'" />';
?>

Fazit

Unterschätze niemals die kriminelle Energie und den Einfallsreichtum der Hacker und Angreifer. Solange es möglich ist, nutze so viele Sicherheitsstufen wie du nur kannst. Mache den Angreifern das Leben so schwer wie nur möglich. Selbst wenn sie es schaffen, manipulierte Daten in die Datenbank zu schreiben, kannst du dessen ungefilterte Ausgabe im Theme verhindern.

Kümmerst du dich als Theme Entwickler nur um Ausgaben, nutze Escaping. Baust du auch Eingaben und entwickelst beispielsweise ein Plugin, nutze ebenfalls Validierung und Sanitization!

Es erhöht nicht nur die Sicherheit deines Codes, sondern macht ihn auch haltbarer und leistungsstärker.


Adrian Lambertz

Seit 2010 bin ich nun schon bei Pixelbar mit dabei. Zuerst als Auszubildender und nach erfolgreichem Abschluss meiner Ausbildung als Frontend-Entwickler.

Ohne Musik und Kaffee kann ich nicht leben, daher konsumiere ich beides während der Arbeit praktisch durchgehend :).

Daneben liebe ich WordPress – darauf habe ich mich spezialisiert.

Weitere Beiträge von adrian anzeigen

Hinterlasse eine Antwort