WordPress-Funktionen zum Escapen: esc_html und esc_attr


Escapen und Maskieren

Mit beiden Begriffen ist praktisch das Gleiche gemeint, nur ob das Gleiche stets dasselbe ist, diese Frage stellt sich zuweilen. Sonderzeichen in einem String können zumindest mit einer Escape-Funktion maskiert werden. PHP stellt zum Beispiel Funktionen wie htmlspecialchars und htmlentities zur Verfügung, um eine Reihe von HTML-Sonderzeichen in die entsprechenden Entities zu verwandeln. JavaScript steht dem nicht hinterher und wartet ebenfalls mit einer Escape-Funktion auf.

Gleich ob nun der Begriff Escapen oder Maskieren benutzt wird, im Endergebnis geht es nicht ohne. Sei es um Anführungszeichen innerhalb eines Strings für den Parser oder Interpreter zu maskieren oder um die Möglichkeiten einer ungewollten Ausgabe von Schadcode durch die Umwandlung von spitzen Klammern, Anführungs- und anderen Zeichen in Entities einzuschränken. Selbstverständlich sollten auch bei der Entwicklung eines Themes oder Plugins für WordPress nicht nur dann Zeichen und Strings maskiert werden, wenn es unbedingt erforderlich ist, sondern im Interesse der Sicherheit lieber einmal zu viel als einmal zu wenig.

WordPress stellt hier eigene Funktionen wie esc_html und esc_attr zur Verfügung. Beide Funktionen unterscheiden sich in der Verwendung nicht, greifen nur intern auf unterschiedliche Funktionen zu. Letztendlich beruhen beide Funktionen auf die PHP-Funktion htmlspecialchars in Verbindung mit der Konstanten ENT_QUOTES und dem Parameter double_encode mit dem booleschen Wert false. In PHP würde die Funktion htmlspecialchars bei einer Ausgabe eines Strings mit echo wie folgt notiert.

echo htmlspecialchars($string, ENT_QUOTES, "utf-8", false);

Im Einzelnen wandelt htmlspecialchars spitze Klammern, & und Anführungszeichen in ihre HTML-Code-Entsprechungen um, die Konstante ENT_QUOTES trägt die Verantwortung dafür, dass sowohl einfache als auch doppelte Anführungszeichen umgewandelt werden, der verwendete Zeichensatz bedarf keiner Erklärung und double_encode gleich false sorgt dafür, dass bereits konvertierte Zeichen nicht doppelt konvertiert werden.

Einfache Verwendung von esc_html() und esc_attr()

Die WordPress-Funktionen esc_html und esc_attr erfüllen den gleichen Zweck (und könnte denselben erfüllen), nur die Handhabung ist einfacher, da kürzer.

Erstes Beispiel:

$string = '<a href="http://www.example.com">Linktext</a>';

echo esc_html($string);

/* 
Ausgabe im Quelltext:

&lt;a href=&quot;http://www.example.com&quot;&gt;Linktext&lt;/a&gt;
*/

Die Funktion esc_attr wurde als handliche Funktion zur Absicherung von Parameter- und Attribute-Werten und als Ersatz für die seit WP 2.8 als veraltet eingestufte Funktion attribute_escape entwickelt, zumindest lässt die Beschreibung der Funktion darauf schließen, doch die Funktion esc_html erfüllt diese Aufgabe ebenso. Intern greift die Funktion esc_attr immer noch auf die Funktion attribute_escape zu. Die zuletzt genannte Funktion wird in der Datei deprecated.php (Verzeichnis wp-includes) definiert, die Funktionen esc_html und esc_attr hingegen in der Datei formatting.php

Die Varianten esc_html__() und esc_attr__()

Beide Varianten, ebenso die weiter unten genannten, unterscheiden sich nicht in der Filterung von HTML und HTML-Attributen, rufen jedoch zusätzlich die Übersetzungsfunktion auf. Wird vom Script ein zu übersetzender String nicht in einer Sprachdatei gefunden, so enthält die Ausgabe den unveränderten String. Es kann ein zweites Argument für $domain angeben werden, allein ein praktischer Test gelang bisher nicht (Stand: Januar 2014).

Zweites Beispiel:

echo esc_html__( 'Reply' );

// Ausgabe im Quelltext: Antworten

Die Varianten esc_html_e() und esc_attr_e()

Beide Funktionen entsprechen den zuvor genannten Funktion esc_html__() und esc_attr__(), mit den Unterschied, dass beide Funktionen keinen Rückgabewert liefern, der mit echo ausgegeben werden müsste, da das Sprachkonstrukt echo in der Funktionsdefinition notiert wurde.

Hinterlasse eine Antwort

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