htmlspechialchars - wenn ich html zeichen im Text haben will?
Jonas
- php
Hallo,
nochmal eine Frage zu htmlspecialchars...
Es heißt ja, man soll sich die Daten aus der Datenbankabfrage immer mit htmlspecialchars ausgeben lassen um so bösartigen Code zu vermeiden
also z.B:
select text from t_text where...
$t=htmlspecialchars($ausgabe["text"]);
echo $t;
Wenn ich nun aber innerhalb des auszugebenden TExtes zb. ein <br> habe dann wird mir das so ja hingeschrieben und nicht als Zeilenumbruch verstanden - aber ich will da den Zeilenumbruch haben - wie mache ich das? Bzw. wie muß ich den Text oder das <br> eingeben, damit es auch als solches gelesen wird?
Hatte bei meinem Beispiel den Text einfach aus einer txt Datei kopiert und via phpmyadmin in die DB eingefügt.
Danke,
Jonas
Moin!
Es heißt ja, man soll sich die Daten aus der Datenbankabfrage immer mit htmlspecialchars ausgeben lassen um so bösartigen Code zu vermeiden
also z.B:
select text from t_text where...
$t=htmlspecialchars($ausgabe["text"]);echo $t;
Nur als Randbemerkung: Diese Befehlsabfolge ist ungünstig, weil in der gefährlichen Operation, nämlich dem echo, keinerlei Hinweis auf die Entschärfung des Variableninhalts von $t enthalten ist.
Wenn ich sowas wie "echo $variable" im Code stehen sehe, gehen eigentlich immer alle Alarmlichter an, weil dort _potentiell_ Code-Injection stattfinden könnte. Da aber sicherzugehen, bedeutet oft, aufwendig den vorhergehenden Code zu betrachten, zu verstehen, dem Labyrinth aus IF-Abfragen und Schleifen zu folgen etc.
Deshalb besser: echo htmlspecialchars($ausgabe["text"]);
Schon sieht man auf einen Blick: In dieser Zeile ist alles sicher.
Wenn ich nun aber innerhalb des auszugebenden TExtes zb. ein <br> habe dann wird mir das so ja hingeschrieben und nicht als Zeilenumbruch verstanden - aber ich will da den Zeilenumbruch haben - wie mache ich das? Bzw. wie muß ich den Text oder das <br> eingeben, damit es auch als solches gelesen wird?
Hier mußt du den Konflikt lösen, der entsteht, wenn du Formatieranweisungen und schlichten Text mischst, dir aber nur Text zur Verfügung steht, um Formatieranweisungen zu signalisieren.
Es gibt mehrere Ansätze:
1. Du könntest explizit auf die Existenz von "<br>" prüfen und diesen Textteil von der Wandlung in Entities ausnehmen. Im Endeffekt hättest du also eine Liste von bekannten HTML-Anweisungen, die du explizit erlaubst. Nachteil: 1. Dieses HTML kann dann niemals mehr als Textausgabe erscheinen. 2. Es hängt vom Benutzer ab, ob er die Verschachtelung korrekt durchführt.
2. Wenn es dir nur um das schlichte "Erhalten" von Zeilenumbrüchen geht, die man z.B. in einer Textarea eingegeben hat, wäre die Funktion nl2br() genau das Richtige:
echo nl2br(htmlspecialchars($ausgabe));
3. Komplexe Anforderungen an Formatierbarkeit bei gleichzeitiger Reduktion der Injection-Risiken erfüllt beispielsweise die Nutzung von BB-Codes. Ein entsprechend programmierter BB-Code-Parser sorgt für die korrekte Schachtelung des HTML-Ergebnisses, filtert alles unerlaubte heraus und erlaubt dennoch eine recht weitgehende Formatierbarkeit.
4. Wenn die Benutzer vertrauenswürdig sind, kann natürlich auch darüber nachgedacht werden, den Datenbankinhalt nicht als "text/plain" anzusehen, sondern als "text/html". Das bedeutet dann aber, dass der Benutzer für die korrekte Eingabe von HTML-Entities verantwortlich ist, wenn er die Zeichen <, > und & darstellen will. Man könnte eventuell auch in dieser Konstellation ein wenig filtern oder sonstige Automatiken zur Arbeitserleichterung integrieren, aber insgesamt ist dieser Weg eher ungünstig.
- Sven Rautenberg
Hi,
Wenn ich nun aber innerhalb des auszugebenden TExtes zb. ein <br>
wieso hast Du das in der Datenbank? Das hat hier normalerweise nichts zu suchen. Wenn es sich um Usereingaben handelt, dann solltest Du sie nicht mit hinzugefügtem HTML-Code speichern.
freundliche Grüße
Ingo