Fix htmlspecialchars() in PHP 5.4+ für Latin1 (ISO-8859-1)


Problem

In vielen PHP Legacy Produkten von uns wird die Funktion htmlspecialchars($string) verwendet, um Zeichen wie < und > und Quotes etc. zu HTML-Entitäten umgewandelt auszugeben und somit die HTML-Interpretation oder Quotesasymmetrien zu vermeiden.

Ab PHP 5.4 wird für $string in htmlspecialchars($string) neu utf8 angenommen, wenn kein Charset als dritter Parameter explizit definiert wird. Legacy Produkte benutzen aber mehrheitlich Latin1 (alias iso-8859-1) als Zeichensatz, was unter PHP5.4 bei den Funktionen htmlspecialchars(), htmlentities() und html_entity_decode() zu leeren Rückgabewerten führt, wenn Sonderzeichen wie Umlaute in $string sind:

PHP<5.4

echo htmlspecialchars('<b>Woermann</b>') //Ausgabe: &lt;b&gt;Woermann&lt;/b&gt;
echo htmlspecialchars('<b>Wörmann</b>') //Ausgabe: &lt;b&gt;Wörmann&lt;/b&gt;


PHP=5.4

echo htmlspecialchars('<b>Woermann</b>') //Ausgabe: &lt;b&gt;Woermann&lt;/b&gt;
echo htmlspecialchars('<b>Wörmann</b>') //Ausgabe: leer


Lösungsvarianten

[red]a) Betroffene Legacy Produkte nicht auf PHP5.4 laufen lassen

[orn]b) Alle betroffenen Stellen
htmlspecialchars($string) und *** im Code der Legacyprodukte umschreiben zu
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'ISO-8859-1')

c) htmlspecialchars() und *** durch eigene Funktionen ersetzen

*** Das Gleiche gilt für die Funktionen htmlentities() und html_entity_decode() und htmlspecialchars_decode() und get_html_translation_table()

Die Variante c


1 Machen Sie im ganzen betroffenen Projekt Suchen und Ersetzen:

Suchen nach:        htmlspecialchars
Ersetzen durch:     htmlXspecialchars

Suchen nach:        htmlentities
Ersetzen durch:     htmlXentities

Suchen nach:        html_entity_decode
Ersetzen durch:     htmlX_entity_decode

2a Platzieren Sie folgende Ersatzfunktionen in einer Datei, die im ganzen Projekt überall inkludiert ist (aber pro Request natürlich nur einmal, sonst gibt es einen Redeclare Function Fatal Error).

function htmlXspecialchars($string, $ent=ENT_COMPAT, $charset='ISO-8859-1') {
return htmlspecialchars($string, $ent, $charset);
}

function htmlXentities($string, $ent=ENT_COMPAT, $charset='ISO-8859-1') {
return htmlentities($string, $ent, $charset);
}

function htmlX_entity_decode($string, $ent=ENT_COMPAT, $charset='ISO-8859-1') {
return html_entity_decode($string, $ent, $charset);
}

oder 2b Platzieren Sie die obgenannten Ersatzfunktionen in einer eigenen Datei, z. B. htmlXfunctions.inc.php und inkludieren Sie diese Datei mittels require_once('htmlXfunctions.inc.php') in allen PHP-Dateien – möglichst je auf der ersten Zeile – des betroffenen Projektes.

Addendum

Wenn Ihr Legacy Produkt auch die Funktionen htmlspecialchars_decode() und get_html_translation_table() einsetzt, müssen Sie diese analaog html_entity_decode() auch mit in die Lösung einbeziehen.

Siehe auch die weiterentwickelte Version: pdf „htmlXfunctions“

Weitere Kompatibilitätslösung: Emulate PHP’s original mysql extension with mysqli mapping functions

Download

Content Management System u5CMS

Service

English⇄German Translation Service

Blumen

blumen-bern-maarsen.ch