Entwickler-Ecke
Programmiersprachen (Server) - String unescapen
Marco D. - Fr 24.08.07 22:24
Titel: String unescapen
Beim Eintragen von Daten in die DB werden sie durch mysql_real_escape_string escaped. Wenn dort nun ein " vorkommt, wird daraus \". Okay, aber: Beim Anzeigen der Daten aus der DB stört dieses \. Wie kriegt man es weg? Ich möchte gerne das Gegenteil von mysql_real_escape_string erreichen.
arj - Fr 24.08.07 22:27
Beim auslesen aus der Datenbank sollten die Symbole nicht "escaped" sein!
Man muss also nichts zurückescapen.
Schau mal wie sie in der Datenbank drinstehen.
btw. Kennt jemand ein gutes deutsches Wort für "escape"?
Marco D. - Fr 24.08.07 22:30
arj hat folgendes geschrieben: |
Beim auslesen aus der Datenbank sollten die Symbole nicht "escaped" sein! |
Sind sie aber. Warum nicht? Ich bin der Meinung, dass gehört sich so, zum Schutz vor XSS und SQL-Injections (BenBE hat mir mal davon erzählt).
arj hat folgendes geschrieben: |
Man muss also nichts zurückescapen. |
Doch. ;)
arj hat folgendes geschrieben: |
Schau mal wie sie in der Datenbank drinstehen. |
Sie sind escaped.
arj hat folgendes geschrieben: |
btw. Kennt jemand ein gutes deutsches Wort für "escape"? |
Ich würde in diesem Kontext von "entschärft" reden.
arj - Fr 24.08.07 22:44
Wenn das so ist, versuch mal stripslashes vielleicht reicht das schon.
Marco D. - Fr 24.08.07 23:06
Hey super das funktioniert einwandfrei. :zustimm:
arj - Fr 24.08.07 23:10
Marco D. hat folgendes geschrieben: |
arj hat folgendes geschrieben: | Beim auslesen aus der Datenbank sollten die Symbole nicht "escaped" sein! |
Sind sie aber. Warum nicht? Ich bin der Meinung, dass gehört sich so, zum Schutz vor XSS und SQL-Injections (BenBE hat mir mal davon erzählt) |
Mein Test hat mich gerade nicht davon überzeugt dass die Daten escaped dann in der Datenbank stehen.
Das würde mich auch sehr stark wundern.
Marco D. - Fr 24.08.07 23:14
Wo hast du getestet? Meinst du irgendetwas bestimmtes? :gruebel:
Wie soll das denn sonst gehen? Ich muss im Query alle Eingaben von außen escapen. Dann folgt doch daraus, dass diese auch so in der DB stehen.
Christian S. - Fr 24.08.07 23:55
Wenn die Daten escaped in der Datenbank stehen, hast Du einmal zuviel escaped.
Wenn Du diesen SQl-String hast:
SQL-Anweisung
1:
| INSERT INTO myTable VALUES ("blah \" blubb") |
steht in der Datenbank hinterher:
So steht auch Dein erstes Posting so in der DB, wie Du es oben siehst.
//edit: Ups, Notiz an mich, da ist ein Bug im SQL-Highlighter ;-)
arj - Sa 25.08.07 10:11
Zitat: |
Wenn die Daten escaped in der Datenbank stehen, hast Du einmal zuviel escaped. |
Der Meinung bin ich allerdings auch ;)
Ich hab in etwa das getestet was Christian auch gemacht hat.
OT: Witzigerweise in eine Tabelle namens Blub *g*
arj - So 26.08.07 21:00
Ich bin gerade zufälligerweise auf dasselbe Problem gestoßen:
Bei mir war das Problem, dass ich folgendes gemacht hab:
SQL-Anweisung
1: 2: 3:
| $titel = mysql_real_escape_string($_POST["titel"]); $sql = "INSERT INTO `table` (title) VALUES ('".$title."')"; echo $sql; |
Wenn ich also in der Form
eingebeben habe war das Ergebnis folgendes:
Zitat: |
INSERT INTO `table` (title) VALUES ('foo\\\'s bar) |
Irgendwo wurde von PHP automatisch nochmals escaped.
Das Problem bleibt bestehen, wenn man einfache Anführungszeichen nimmt.
Auch eine Lösung mit sprintf bringt nichts :-/
Nach etwas googeln bin ich dann schließlich auf die Lösung gestoßen:
Der Schalter
magic_quotes_gpc [
http://www.php-homepage.de/manual/ref.info.php#ini.magic-quotes-gpc] war aktiviert. Dadurch werden die Strings, die über GET, POST oder Cookies kommen automatisch
escaped. (vgl.
magic_quotes_runtime [
http://www.php-homepage.de/manual/ref.info.php#ini.magic_quotes_runtime])
Ich muss also den Titel selbst nicht mehr escapen:
SQL-Anweisung
1: 2:
| $titel = $_POST["titel"]; $sql = "INSERT INTO `table` (title) VALUES ('".$title."')"; |
Arne K. - Mo 27.08.07 15:58
In der Praxis prüft man meist zunächst, ob PHP < 6 installiert ist.
Wenn ja, prüft man, ob magic_quotes_gpc() aktiv ist.
Wenn ja, macht man ein array_map() mit einem stripslashes() auf alle superglobalen Input-Arrays.
Problem gelöst ;)
BenBE - Mo 27.08.07 18:10
Mit Magic Quotes löst man halt die Probleme, die man ohne sie nicht hätte ...
delfiphan - Mo 27.08.07 22:11
Ich kenne Delphi4PHP nicht, aber man sollte es vermeiden, Parameter direkt in die Query zu schreiben. Die Konversion zu String der Query und zurück zum gewünschten Datentyp ist unnötiger Overhead.
Bei indirekter Parameterübergabe ist der Daten-Typ bekannt, eine Konversion zu/von String entfällt, es ist kein Escapen/Unescapen nötig, die ganze Sache ist sicherer und der Code ist insgesamt übersichtlicher (da Daten vom Code getrennt sind).
Bsp:
SELECT * FROM TABLE WHERE ID = :MYID
Danach Parameter MYID übergeben (dürfte ähnlich aussehen wie Query.Params.ParamByName('MYID').AsInteger := 1).
Last but not least: Vom direkt reinkompilierten Queries in der Exe würd ich auch abraten (ab einer gewissen Grösse des Projektes auf jeden Fall). Stored procedures schreiben, falls die unterstützt werden.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!