HTML filtern außer Ausnahmen

Identität

Erfahrenes Mitglied
Hallo,

ich habe eine Textarea. Der Inhalt wird in einer Datenbank gespeichert. Es soll alles was nach HTML oder Javascript aussieht sofort encodiert werden, bis auf einige wenige HTMl Befehle. <strong>,<del>,<em>,<a> und <img> Tags sollen erlaubt werden. Leider funktioniert folgender Code nicht mit den <a> Tags, gibt es vielleicht eine ähnliche Funktion?

Code:
$zusatz = mysql_real_escape_string(strip_tags($_POST['beschreibung'], '<strong><em><img><a><del>'));

Vielleicht gibt es ja im Internet auch Beispiele. Danke für eure Hilfe!
 
Ja er lässt den Befehl zwar stehen, aber man kann den Link nicht anklicken weil vor dem " ein / auftaucht.

So schaut es im Quelltext dann aus:
Code:
<a href=\"http://www.domain.net\" target=\"_blank\">Your text to link...</a>
 
Das mit den Slashes vor dem Double-Quote war die Funktion mysql_real_escape_string. Das kannst vielleicht mit stripslashes weg kriegen, was aber gegen den Sinn von mysql_real_escape_string ist, falls du den String abspeicherst.

http://de3.php.net/manual/de/function.mysql-real-escape-string.php hat gesagt.:
mysql_real_escape_string() ruft die Funktion mysql_real_escape_string der MySQL-Bibliothek auf, die folgende Zeichen mit einem Backslash ('\') versieht: \x00, \n, \r, \, ', " und \x1a.
 
Zuletzt bearbeitet:
Die Backslashes dürften eher durch Konfigurationseinstellung magic_quotes_gpc verursacht werden....entferne die Slashes bevor du die POST-Daten weiterverarbeitest:
PHP:
$zusatz = mysql_real_escape_string(
            strip_tags(
              (
                (get_magic_quotes_gpc())    
                  ? stripslashes($_POST['beschreibung'])
                  : $_POST['beschreibung']
              ), 
                            
              '<strong><em><img><a><del>'
            ));

Beachte jedoch, dass strip_tags dich nicht vor der Einschleusung von JS-Code(über bspw. Eventhandler) bewahrt ;)
 
Zuletzt bearbeitet:
@ZodiacXP: Nur mal so zum Verständnis: Wenn Du einen mit mysql_real_escape_string maskierten String in einer Abfrage verwendest, bedeutet das lediglich, dass die Datenbank die maskierten Zeichen als normale Zeichen und nicht in ihrer besonderen Bedeutung interpretiert, nicht aber, dass die Slashes mitgespeichert werden. Wenn die Slashes tatsächlich in der Datenbank stehen, muss doppelt maskiert worden sein. Somit hat Sven höchstwahrscheinlich recht. Hatte ich gar nicht dran gedacht... ;)

LG
 
Hallo nochmal,

und was würde jemand mit bösen absichten anstellen können, wenn ich mysql_real_escape_string() , welches dann wohl anscheinend die / reinmacht, entferne und einfach nur HTML usw. entfernen lasse?

Die Ausgabe ist ganz einfach: So in der Art sieht die aus:

Code:
$sql = "SELECT * FROM XX";
$row = mysql_query(mysql_fetch_assoc($sql));
echo nl2br($row['beschreibung']);

Sollte euch etwas negatives auffallen, immer bescheid geben. Ich lern immer gern neue Sachen.
 
Hi,

Hallo nochmal,

und was würde jemand mit bösen absichten anstellen können, wenn ich mysql_real_escape_string() , welches dann wohl anscheinend die / reinmacht, entferne und einfach nur HTML usw. entfernen lasse?

Informationen dazu findest Du unter dem Stichwort SQL-Injection.
Lies alle Antworten. Du sollst nicht mysql_real_escape_string entfernen, sondern vorher stripslashes anwenden, falls magic_quotes_gpc angeschaltet ist. Schau Dir Svens Code an.

LG
 
Ich habe den Code von Sven Mintel benutzt und es funktioniert :-)

Zwar werden die HTML Befehle jetzt ganz gelöscht, aber das macht nichts, es soll ja eh kein HTML rein ;-)

Danke für die echt kompetente Hilfe, ich lern gerade noch ein bisschen über SQL-Injection. Ist ja ziemlich umfangreich das Thema.
 
Zurück