Frage zu htmlentities()

Kai-Behncke

Erfahrenes Mitglied
Hallo allerseits,

trotz intensiven Googlens finde ich leider keine Lösung für folgendes Phänomen:

Über ein Fromular (textfeld) gebe ich folgenden String ein:


"Ein 'Anführungszeichen' ist <b>fett</b>"

Dieser String wird dann wie folgt in eine Variable übergeben:

$input_besonderheiten=htmlentities(trim($_POST['input_besonderheiten']));

....und in eine Datenbank geschrieben.

Wenn ich mir den Eintrag in der DB anschaue, dann steht dort:

"Ein 'Anführungszeichen' ist <b>fett</b>";


Aber muesste dort nicht eigentlich stehen:

Ein 'Anf&uuml;hrungszeichen' ist &lt;b&gt;fett&lt;/b&gt;

Please help.
Danke im Voraus, Kai
 
Moin Kai,

jo, es sollte in der DB so stehen, wie angenommen.

Warum es dort nicht steht...dazu bräuchte man mehr vom Code zur Ansicht.
Wie liest/schreibst du in der DB?
 
Hi Sven,

danke zunächst, dann bin ich scheinbar zumindest nicht völlig auf dem Holzweg.

Ich schreibe in die DB wie folgt:

Code:
pg_query("update cms_gastronomie_grunddaten_cafe_pub_nightclub SET besonderheiten='$input_besonderheiten',bew_oeffentlich='$input_bew_oeffentlich' WHERE objekt_id=$objekt_id");


Ganz merkwürdig wird es aber jetzt.
Ich definiere die Variablen in der datei variablen.php.
Dort versuche ich nun folgendes:

Code:
$input_besonderheiten=htmlentities($_POST['input_besonderheiten']);
echo "Ausgabe 1 $input_besonderheiten ";
echo "<br>";
$input_besonderheiten=htmlentities($input_besonderheiten);
echo "Ausgabe 2 $input_besonderheiten ";
echo "<br>";

Ausgabe 2 gibt mir dann immerhin schon mal:

Ausgabe 2 \&quot;Ein \'Anf&uuml;hrungszeichen\' ist &lt;b&gt;fett&lt;/b&gt;\&quot;;


....wobei ich nicht verstehe, warum da quasi ein doppeltes htmlentities nötig ist.

Die Datei "variablen.php" wird dann von der Datei "daten_speichern.php" inkludiert,
und wenn ich dort angebe:

echo "Ausgabe 3 $input_besonderheiten ";


dann kriege ich als Output im Browser:

Ausgabe 3 \"Ein \'Anführungszeichen\' ist fett\";


und in der DB steht:

"Ein 'Anführungszeichen' ist <b>fett</b>";

Das verstehe ich nicht ansatzeise.....

Ich liege doch richtig: Wenn html-code in die DB geschrieben wird (also so wie z.Zt. bei mir) dann ist das ein Sicherheitsrisiko, oder?
 
Es ist nur dann ein Sicherheitsrisiko, wenn es bei der Ausgabe auch wieder als HTML interpretiert wird.
Wenn es bei der Ausgabe aber maskiert wird, dann besteht keine Gefahr, dass es dein Design zerreißt oder im schlimmsten Falle fremde Daten einbindet.
 
Nochmal nachgefragt:-(

Du schreibst "in der DB steht"...womit schasut du in der DB nach?

Und um Missverständnisse auszuschliessen: Was meinst du mit Ausgabe?
Den HTML-Quelltext oder das, was du im Browserfenster siehst?

Ich liege doch richtig: Wenn html-code in die DB geschrieben wird (also so wie z.Zt. bei mir) dann ist das ein Sicherheitsrisiko, oder?

Nö, da liegst du eigentlich falsch.
Ein Problem stellen nur die Quotes dar, dafür gibt es aber bspw. mysql_real_escape_string()
Die anderen HTML-eigenen Zeichen < > & sind für die DB ganz normale Zeichen.

Ein Sicherheitsproblem hast du erst, wenn du diesen HTML-Code aus der Benutzereingabe als solchen ausgibst.
 
Hallo nochmal,

vielen Dank für Eure Mühen, jetzt funktioniert es.
Ich hatte ein weiteres Skipt inkludiert und in diesem irrtümlich meine vorherige Umwandlung überschrieben.


Es ist nur dann ein Sicherheitsrisiko, wenn es bei der Ausgabe auch wieder als HTML interpretiert wird.
Wenn es bei der Ausgabe aber maskiert wird, dann besteht keine Gefahr, dass es dein Design zerreißt oder im schlimmsten Falle fremde Daten einbindet.


Ah, ok. Das bedeutet ich kann beim Einlesen in die DB ohne Probleme:

$input_besonderheiten=$_POST['input_besonderheiten'];

nutzen?

Welchen Code sollte ich beim Auslesen nutzen, dann dort so etwas wie:

$input_besonderheiten=htmlentities(trim(strip_tags($_POST['input_besonderheiten']))); ?



Nochmals danke, Kai
 
Zurück