• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

htmlentities - Wann sinnvoll einzusetzen ?

StephanBo

Mitglied
Ich arbeite gerade an einem sehr umfangreichen Member-Script und erweitere dieses, so dass hieraus auch ein CMS für den Benutzer und auch den Admin geschaffen wird.

Jetzt habe ich bei der Eingabe von Daten welche in einer DB gespeichert werden beispielsweise folgenden Befehl:

$profile_title = mysqli_real_escape_string($conn, trim(htmlentities($_POST['ProfileTitle'])));

Die "htmlentities" Anweisung bewirkt, dass alle Sonderzeichen in eine html-Codierung umgewandelt werden (ungeachtet ob die Übergabe an den Server mit utf8 erfolgt). Lasse ich diese htmlentities Konstrukt aus, werden also Sonderzeichen wieder in der Datenbank als Sonderzeichen gespeichert.

Meine Frage ist nun, warum man "htmlentities" überhaupt benutzt und welche Vorteile man daraus zieht?! Oder stammt diese Anweisung noch aus Zeiten, wo mySQL Probleme hatte, Zeichesätze richtig zu codieren und encoden? Wichtig wäre mir auch zu wissen, ob diese Anweisung wichtig zur Verhinderung von sql-injections ist oder damit nichts zu tun hat.
 
htmlentities() ist nicht für Sonderzeichen nötig. Wenn die Datenbank in einem passenden Zeichensatz angelegt ist und auch die Datenbankverbindung passt, brauchst du es nicht.

htmlentities() und htmlspecialchars() haben eigentlich nichts mit dem Zeichensatz zu tun. Sie sollen HTML-Sonderzeichen maskieren. Zu diesen Zeichen gehören etwa <, >, ", &, etc. Diese werden so umgewandelt, dass sie vom Browser nicht interpretiert werden, also etwa zu &lt; oder &gt;.
PHP:
echo htmlspecialchars('<string>');
// Ausgabe im Quelltext: &lt;string&gt;
// Anzeige im Browser: <string>
Damit haben diese Funktionen eher eine Sicherheitsaufgabe. Wenn bspw. fremde Benutzer durch ein Gästebuchscript Inhalte in eine DB schreiben, welche danach im Browser angezeigt werden, besteht eine Cross-Site-Scripting-Gefahr (XSS). Der Schreiber könnte ein JavaScript <script> einschleusen, das vom Browser interpretiert wird, es sei denn, es wird durch obige Funktionen maskiert. Mit SQL-Injections allerdings hat das nichts zu tun.

Stilistisch übrigens ist es üblich, htmlentities()/htmlspecialchars() erst bei der Seitenausgabe anzuwenden, und nicht schon beim Eintragen in die Datenbank.
 
Ok, danke schon mal. Gut erklärt.

Natürlich will ich so viele Sicherheitslücken wie möglich geschlossen haben und die Sache mit der Cross-Site-Scripting-Gefahr leuchtet ein. Wenn dies jedoch nicht in Zusammenhang mit einer SQL-injection zu bringen ist, dann werde ich diese Anweisung bei der Eingabe weglassen, dafür aber wie du es schon sagtest, besser bei der Ausgabe einbringen.
 
Ich habe es jetzt mit htmlspecialchars() gelöst und die Sonderzeichen werden nun auch wieder korrekt dargestellt. Jetzt hatte ich aber gerade gelesen, dass man auch einfach nach htmlentities() den Zusatz: "...ENT_QUOTES, "UTF-8"..." einbringen soll und schon werden die Sonderzeichen wieder utf8-konform gespeichert.

Beispielbefehl:

$profile_title = mysqli_real_escape_string($conn, trim(htmlentities($_POST['ProfileTitle'], ENT_QUOTES, "UTF-8")));
 
Es ist allerdings sinnlos, htmlentities zu benutzen. Und wozu escapst du erst mit htmlentities und dann mit mysqli_real_escape_string?
 
Zurück
Oben