1
Zitat von Ranma Zitat von Jörg htmlentities() (oder besser htmlspecialchars()) würde ich immer erst bei der Ausgabe in HTML anwenden, weil dort alle Strings behandelt werden müssen, nicht nur die aus der Datenbank. Zum anderen kann es durchaus passieren, dass man Daten aus der Datenbank auch in Bereichen verwenden möchte, wo ein htmlentities() bzw. htmlspecialchars() wieder rückgängig gemacht werden müsste.
Kein htmlentities() bedeutet aber, sich jedem Angriff hilflos auszuliefern? Da braucht die Benutzereingabe, die entweder ein neuer Datensatz oder nur ein Suchbegriff sein kann, nur mit "> beginnen...
Oder war es "; ? Fast egal, jedenfalls muß es entschärft werden. Also kann ich nicht einfach so irgendetwas eintragen lassen.
Mit htmlentities() bzw. htmlspecialchars() sichert man keine SQL-Queries ab, sondern HTML-Code. Die beiden Funktionen sollten also auch genau dort zum Einsatz kommen, d.h. bei der Ausgabe von HTML-Code!
Und dort musst du darauf achten, dass alle Variablen, ob sie nun aus der Datenbank oder über ein Formular oder sonstwoher kommen, entsprechend behandelt werden:
<p>Aus Formular: <?php echo htmlspecialchars($_POST['bla']) ?></p>
<p>Aus Datenbank: <?php echo htmlspecialchars($row['blub']) ?></p>
Wenn die Variablen aber nicht in HTML-Code, sondern z.B. in eine (nicht-HTML-)Email ausgegeben werden, dann benötigst du dort auch kein htmlspecialchars()
Ist htmlspecialchars() nicht nur eine veraltete Version von htmlentities() ?
Nein, htmlspecialchars() kodiert nur die Metachars <, >, ", &
htmlentities() kodiert darüber hinaus alle Zeichen, die nicht im ASCII-Zeichensatz vorkommen (wie z.B. deutsche Umlaute). Letzteres ist aber nicht notwendig, wenn die Webseite die korrekte Kodierung angibt, z.B.:
<meta http-equiv="content-type" content="text/html; charset=utf-8" />