Home
Navigation
Impressum
SEO Welten - Webcoding, Editoren, Scripte und Anwendungen
SEO Welten
Buchempfehlungen
 

htmlspecialchars und htmlentities mit double_encode

Beispiele: double_encode richtig verwenden

Beim Programmieren einer Anwendung sollte niemals die Sicherheit eines Scripts außer acht gelassen werden, soviel ist gewiss. Sicherheit ist wichtig, auch wenn es keinen hundertprozentigen Schutz vor unlauteren Zeitgenossen gibt. PHP verfügt über einige Funktionen, die, richtig angewendet, einen gewissen Schutz bieten. Neben der Funktion strip_tags() werden am häufigsten die Funktionen htmlspecialchars() und htmlentities() verwendet, um ein Mindestmaß an Sicherheit bei der Ausgabe zu erreichen. Mit der Funktion htmlspecialchars() werden einige Sonderzeichen entschärft und statt den Sonderzeichen ihre unschädlichen HTML-Codes ausgegeben, mit der htmlentities() alle Sonderzeichen umgewandelt, für die es einen entsprechenden Code in HTML gibt.
Mit den Parametern ENT_NOQUOTES, ENT_COMPAT und ENT_QUOTES lässt sich weiterhin steuern, wie einfache und doppelte Anführungszeichen zu behandeln sind. Soweit, so gut, zu einem Problem wurden gelegenlicht doppelt kodierte HTML-Entities, zumindest bis zur PHP Version kleiner 5.2.3.

Ein Beispiel, bei dem die HTML-Entities der Umlaute unbrauchbar werden:

$einString = "'Honig' & süße \"Schokolade\"";

echo htmlentities($einString, ENT_QUOTES)."\n";

/*
Ausgabe im Quelltext:

'Honig' & süße "Schokolade"

Ausgabe Monitor:

'Honig' & süße "Schokolade"
*/

Mit der Version PHP 5.2.3 wurde von den Machern von PHP für die Funktionen htmlspecialchars() und htmlentities() der zusätzliche Parameter double_encode eingeführt, der dieses Problem behebt. Doch bei der Suche nach Beispielen stößt ein unerfahrener Einsteiger zuweilen auf kuriose Gebilde, jedoch kaum auf funktionierende Code-Schnipsel. Dabei ist die Anwendung dieses zusätzlichen Parameters eigentlich recht simpel, wenn die Reihenfolge der Parameter vom Programmierer beachtet wird.

Reihenfolge der Parameter:

string htmlentities ( string $string [, int $quote_style = ENT_COMPAT [, string $charset [, bool $double_encode = true ]]] )

Quelle: http://php.net/manual/de/function.htmlentities.php

Reihenfolge: htmlentities(der String, ein Integerwert, ein String für Charset, einen boolean Wahrheitswert)

Bei Beachtung der Reihenfolge wird der eine oder andere Einsteiger eventuell den integeren Wert vermissen. Bei den Parametern ENT_NOQUOTES, ENT_COMPAT und ENT_QUOTES handelt es sich jedoch um Konstanten, die einem integeren Wert entsprechen. Statt den Konstanten lassen sich "nur zu Testzwecken" ganzzahlige Werte (Integer ist ein Datentyp für ganze Zahlen) einsetzen.

Nur ein Test:

$einString = "Ich 'bin' nur \"ein\" Teststring";

echo htmlentities($einString, 0)."<br>\n";
echo htmlentities($einString, 2)."<br>\n";
echo htmlentities($einString, 3)."<br>\n";

/*

Ich 'bin' nur "ein" Teststring<br>
Ich 'bin' nur &quot;ein&quot; Teststring<br>
Ich &#039;bin&#039; nur &quot;ein&quot; Teststring<br>

Ergebnis des Tests (Nicht verbindlich, da nur ein Test!):

0 entspricht ENT_NOQUOTES
2 entspricht ENT_COMPAT
3 entspricht ENT_QUOTES

*/

Bleiben wir bei der eigentlich Schreibweise und betrachten uns den nächsten Parameter und dessen Werte. Gefragt ist ein String, der den Charset bezeichnet. Da die gebräuchlichsten Charsets wie UTF-8 und ISO-8859-1 bereits zu der Grundausstattung beider Funktionen gehören, könnte dieser String eigentlich entfallen. Im Normalfall wird dieser Parameter auch kaum verwendet. Ein Problem entsteht erst dann, wenn der neu hinzu gekommene Parameter double_encode verwendet werden soll, um bereits vorhandene HTML-Entities nicht doppelt zu kodieren. PHP erwartet an dritter Stelle in der Reihenfolge einen String und erst an vierter Stelle einen boolean Wahrheitswert. Und diese Reihenfolge muss eingehalten werden, da alles andere kaum zum Erfolg führen würde.

Beispiele mit htmlspecialchars und double_encode, bei denen die HTML-Entities der Umlaute nicht doppelt kodiert wurden:

$einString = "'Honig' & s&uuml;&szlig;e \"Schokolade\"";

echo htmlspecialchars($einString, ENT_QUOTES, "UTF-8", false)."<br>\n";
echo htmlspecialchars($einString, ENT_QUOTES, "UTF-8", Null)."<br>\n";
echo htmlspecialchars($einString, ENT_QUOTES, "ISO-8859-1", 0)."<br>\n";

/*
Ausgabe im Quelltext:

&#039;Honig&#039; &amp; s&uuml;&szlig;e &quot;Schokolade&quot;<br>
&#039;Honig&#039; &amp; s&uuml;&szlig;e &quot;Schokolade&quot;<br>
&#039;Honig&#039; &amp; s&uuml;&szlig;e &quot;Schokolade&quot;<br>

Ausgabe Monitor:

'Honig' & süße "Schokolade"
'Honig' & süße "Schokolade"
'Honig' & süße "Schokolade"
*/

Anmerkung: Die 0 ist eigentlich kein boolescher Wert, da der boolean Datentyp nur für True und False (wahr und unwahr) ausgelegt ist. Dennoch wird die 0 als false gewertet, wenn kein Typenvergleich durchgeführt wird.

 
Navigation

Finden und
gefunden werden ...


- Optimierung -


Zukunftsaussichten

 

Webcoding

Übersicht


Web Services


Tutorials &
diverse Listings


XML


RegEx

und vieles mehr...


Copyright © 2006 - Verlag Horst Müller - Stendal | Datenschutz | Nutzungsbedingungen