htmlentities
Karim
- php
Wenn ich alle übergebenen Get und Post Variablen mit
htmlentities
durchlaufen lasse, bin ich dann (fast) auf der sicheren Seite. Oder muss ich noch weitere überprüfungen machen?
Karim
Hallo,
durchlaufen lasse, bin ich dann (fast) auf der sicheren Seite. Oder muss ich noch weitere überprüfungen machen?
Was hast du denn vor? Bzw. zu welchem Zweck benutzt du htmlentities?
Grüße
Ich will nur verhindern, das SCHADcode auf meinen Server kommt und diesen einfach nicht zulassen.
Hi,
Ich will nur verhindern, das SCHADcode auf meinen Server kommt und diesen einfach nicht zulassen.
"Schadcode" ist immer relativ zum Kontext zu sehen, in den die Usereingaben ausgegeben werden.
htmlentities/htmlescape säubert die Usereingaben u.a. von HTML, so dass die meisten Cross-Site-Scripting-Attacken unmöglich werden. Die Usereingaben können aber auch z.B. SQL enthalten, welche deine Datenbank löschen oder verändern. Dann musst du z.B. mysql_real_escape (oder vergleichbare Funktionen, welche deine Datenbank/dessen Treiber) anbieten.
Alles, was du darüber wissen willst und musst, steht im Artikel Kontextwechsel.
Bis die Tage,
Matti
Ich verwandel nun alle POST Var mit
foreach ( $_POST as $eingabe => $val )
{
$_POST[$eingabe] = htmlentities ( $val );
}
wäre es nicht sinnvoll, falls damit in der Datenbank gearbeitet wird es so zu machen
foreach ( $_POST as $eingabe => $val )
{
$_POST[$eingabe] = mysql_real_escape_string ((htmlentities ( $val ));
}
Moin!
Ich verwandel nun alle POST Var mit
foreach ( $_POST as $eingabe => $val )
{
$_POST[$eingabe] = htmlentities ( $val );
}
>
> wäre es nicht sinnvoll, falls damit in der Datenbank gearbeitet wird es so zu machen
>
>
> ~~~php
foreach ( $_POST as $eingabe => $val )
> {
> $_POST[$eingabe] = mysql_real_escape_string ((htmlentities ( $val ));
> }
Du hast den Artikel nicht verstanden, oder?
Kernaussage war dort: Kontextwechsel immer nur DORT behandeln, wo sie auftreten, niemals voreilig zu früh. Und genau das machst du hier.
Es ist nicht sinnvoll, pauschal alle Werte in $_POST und $_GET irgendwie zu behandeln! Behandle sie dann, wenn du den Kontext wechselst. Wenn $_GET auf der HTML-Seite ausgegeben werden soll: htmlspecialchars(). Wenn $_GET in die Datenbank gehen soll: mysqli_real_escape_string(). Wenn das Datenbankergebnis wieder auf die Webseite soll: htmlspecialchars() auf das Ergebnis anwenden!
Wenn du es nicht so machst, versaust du dir überall deine Daten und kannst mit ihnen nicht mehr vernünftig arbeiten.
- Sven Rautenberg
Ich versuche mal ein Beispiel zu machen:
Die Daten kommen über ein Formular per POST (10 POST Felder), auf die Seite, also wandel ich alle Daten bevor ich sie weiterverarbeite mit:
htmlspecialchars()
um. Nach dem kein Fehler mehr vorliegt wandel ich diese dann per
mysql_real_escape_string()
und schreibe sie in die Datenbank! Wenn ich diese wieder auslese, dann wandel ich sie wieder per
htmlspecialchars()
zurück.
Hi!
Die Daten kommen über ein Formular per POST (10 POST Felder), auf die Seite, also wandel ich alle Daten bevor ich sie weiterverarbeite mit:
htmlspecialchars()
um.
Falsch. Zur Weiterverarbeitung werden die Rohdaten benötigt. Siehe HTML in der Datenbank.
Nach dem kein Fehler mehr vorliegt wandel ich diese dann per
mysql_real_escape_string()
und schreibe sie in die Datenbank!
Im Falle MySQL richtig.
Wenn ich diese wieder auslese, dann wandel ich sie wieder per
htmlspecialchars()
zurück.
Nein, nicht beim Auslesen, egal woher, sondern erst beim Einfügen in den HTML-Kontext müssen sie HTML-gerecht behandelt werden. Wenn du sie anderswo einfügst, gelten die Regeln des anderen Kontextes.
Lo!
Ich glaub jetzt hab ichs verstanden.
Dafür klappt es jetzt nicht mehr.
Wenn ich folgenden Code habe
<form action="'.htmlentities($_SERVER['PHP_SELF'], ENT_QUOTES, 'iso-8859-15').'" method="post">
und den Satz
Ein 'Anführungszeichen' ist <b>fett</b>
übergebe, müsste laut Anleitung (http://php.net/manual/de/function.htmlentities.php)
Ein 'Anführungszeichen' ist <b>fett</b>
rauskommen.
Vieleicht kannst du mir da nochmal helfen?
Hi!
Wenn ich folgenden Code habe
<form action="'.htmlentities($_SERVER['PHP_SELF'], ENT_QUOTES, 'iso-8859-15').'" method="post">
und den Satz
Ein 'Anführungszeichen' ist <b>fett</b>
übergebe, müsste laut Anleitung (http://php.net/manual/de/function.htmlentities.php)
Ein 'Anführungszeichen' ist <b>fett</b>
rauskommen.
Beides hat nicht viel miteinander zu tun. Das heißt, eigentlich müsste das so gehen, aber ein Satz hat als action-Attribut nichts verloren, da sollte eine URL stehen. Außerdem kann man statt $_SERVER['PHP_SELF'] auch einfach ein leeres action-Attribut notieren. Wie bei anderen relativen Angaben ergänzt der Browser das mit der URL des Dokuments, und somit kommt die derzeitige URL ohne Änderungen raus. Doch zurück zum Thema: Wo genau erwartest du, dass der Satz in die beschriebene Form gebracht wird?
Lo!