[PHP/MySQL] Probleme mit ' und "

martin

Well-Known Member
Hi

ich habe ein Problem mit einem Textfeld, dessen Inhalt ich in die DB speichere. Das Ganze funktioniert wunderbar, mit einer kleinen Ausnahme und zwar funktionieren die Apostrophe nicht. Das ist ärgerlich, vor allem aber bin ich dadurch wahrscheinlich anfällig gegen SQL Injections. Probiert habe ich schon so Einiges, aber irgendwie will das Ganze nicht so recht wie ich möchte.

Ich speichere/update wie folgt:
PHP:
$query = "UPDATE tabelle SET textfeld='".$obj['text']."'";

in $obj['text'] steht der Text der <textarea>, den ich schon versucht habe mit addslashes() zu maskieren und auch mit mysql_escape_string.
Irgendwie mache ich da was falsch, deshalb wollte ich mich hier mal erkundigen wie man das richtig macht. Ich möchte einen Wert/Text von einer <textarea> zunächst in ein Objekt ($obj['text']) speichern, dann alle Werte dieses Objektes in die Datenbank speichern (nach Drücken eines Buttons) und anschließend wieder zurück, also anzeigen lassen.
Wie gesagt das Grundgerüst steht und funktioniert, aber ich weiß nicht wie ich die Texte richtig maskiere, sodass keine Zeichen verschluckt werden und keine SQL Injections möglich sind.

:ugly:
 
Du solltest grundsaetzlich mysql_real_escape_string verwenden anstatt mysql_escape_string. Letzteres ist irgendwie kaputt (weiss nicht mehr was genau) ist aber noch in der mysql API enthalten aus Abwaertskompatibilitaet.
Ka, ob dir das schon weiterhilft.. ansonsten kannst du noch prepared statements ueber mysqli oder PDO machen. Das ist auch etwas schneller wenn du mehrere Anfragen mit dem gleichen Statement machst (ob sich das in PHP rentiert weiss ich aber nicht..).
 
Direkt Strings von Variablen in ein SQL-Query übernehmen ist sehr schlecht. Besser sind prepared Statements und Übergabe der Strings als Parameter. Da muss man sich dann auch keine Gedanken um SQL-Injections machen.
 
Geht es so nicht?

PHP:
$query = "UPDATE tabelle SET textfeld='".mysql_escape_string($obj['text'])."'";

Rob

Danke für die Antworten. Leider klappt es auch so nicht, weder mit mysql_escape_string noch mit mysql_real_escape_string. Habe versucht den String vorher mit addslashes() zu maskieren, ging nicht. Ohne Maskierung auch nicht.

Das Statement wird bei der Eingabe eines ' oder " einfach nicht ausgeführt.
Prepared Statements muss ich mich erst einarbeiten, damit hab ich noch nie gearbeitet. :o
 
...mit mysql_real_escape_string sollte es eigentlich klappen...

Laut Doku benötigt die Funktion aber eine geöffnete Db-Verbindung (Beispiel in der Doku). Ist das in deinem Script so? Oder erstellst du erst die Abfrage in der Variable und öffnest dann die Verbindung?
 
Oenone hat recht. Lasst den Misst und verwendet prepared Statements! Damit kann man sich eine Menge Ärger ersparen.

Dann kann man auch gleich auf PDO umsteigen.
 
Alle Vollidioten, die SQL Statements mit Stringverkettung bauen, gehören mit einem Schlachterhaken an den primären Geschlechtsorganen aufgehängt.
 
Alle Vollidioten, die SQL Statements mit Stringverkettung bauen, gehören mit einem Schlachterhaken an den primären Geschlechtsorganen aufgehängt.

Das ist doch mal konstruktiv, etwas deftig, aber konstruktiv... vllt könnte der @Crest seinen Post begründen? Es darf auch wieder blumig werden...
 
@unull das ist absolut korrekt, ich fand nur den Post etwas weiter oben mit den Fleischerhaken und primären Geschlechtsorganen etwas weniger hilfreich...

ich meine, da postet jemand ne Frage ins Forum um Hilfe zu suchen, und wird dann angemotzt weil er in seinem Script einen etwas anderen Weg geht, als Doku und Richtlinien empfehlen, gibt sein Unwissen zu und wird dafür als dank mit dem Fleischerhacken an den primären Geschlechtsorganen aufgehängt... ohne Hilfe!
 
Zuletzt bearbeitet:
Hallo martin,

Danke für die Antworten. Leider klappt es auch so nicht, weder mit mysql_escape_string noch mit mysql_real_escape_string. Habe versucht den String vorher mit addslashes() zu maskieren, ging nicht. Ohne Maskierung auch nicht.

Das Statement wird bei der Eingabe eines ' oder " einfach nicht ausgeführt.
Prepared Statements muss ich mich erst einarbeiten, damit hab ich noch nie gearbeitet. :o

Hm, ich kann mir schon denken, warum es nicht funktioniert. Sehr wahrscheinlich erzeugt mysql_real_escape_string() auch wieder "- oder '-Zeichen, die den SQL-Interpreter verwirren. Ein ähnliches Problem hatte ich bei PostgreSQL auch. Daher bin ich hergegangen und habe die Zeichenkette in Hexcode umgewandelt und so gespeichert. Der Nachteil ist, dass man dieses Feld nicht mehr so einfach für einen Vergleich heranziehen kann bzw. es müssen halt auch die Vergleichs-Strings umgewandelt werden.
Allerdings solltest aufpassen und vor der Umwandlung prüfen, was da gespeichert wird.

Viele Grüße und viel Erfolg

JueDan
 
Zuletzt bearbeitet:
Soo da bin ich wieder. :)
Keine Sorge wegen des Beitrages mit dem Fleischerhaken, so schnell werdet ihr mich und meine Anfänger Fragen nicht los. Ich weiß es einfach (noch) nicht besser, bin aber lernwillig.
Insofern werde ich mich mal in die prepared statements einarbeiten und es dann noch einmal versuchen.

Danke an alle
 
ich meine, da postet jemand ne Frage ins Forum um Hilfe zu suchen, und wird dann angemotzt weil er in seinem Script einen etwas anderen Weg geht, als Doku und Richtlinien empfehlen, ...
Das Gemotze gilt all den Leuten, die ihn munter dabei unterstützen in die falsche Richtung zu laufen. Der erste Post von Oenone hat alle Fakten dazu kurz und klar gesagt. Das wurde ignoriert und damit ist auch ein etwas harscherer Ton angebracht.
 
hhm...

aber gleich ganz tief in die Kiste greifen, dabei Vollidioten, Fleischerhaken und primäre Geschlechtsorgane herauskramen und als umgefragtes Statement zu posten, ist kein 'etwas harscherer Ton'
 
Gemotze hin oder her, ich habe das Ganze jetzt versucht mit mysqli zu realisieren und keine Ahnung wie ich das anstelle, aber ich komme zum selben Ergebnis wie vorher. Alles klappt wunderbar, solange ich keine ' " eingebe.

Hier mal mein Versuch:
PHP:
$dbhost = '192.168.0.1';
$dbname = 'test';
$dbuser = 'test';
$dbpasswd = 'test';
                
$mysqli = new mysqli($dbhost,$dbuser,$dbpasswd,$dbname);            
                               
$stmt = $mysqli->prepare("INSERT INTO `testtable` (`id`, `art_text`, `anzahl`, `optional`, `fp`) VALUES (?, ?, ?, ?, ?)");
                     
$stmt->bind_param('isdii', $id, $art_text, $anzahl, $optional, $fp);

foreach ($pos as $key => $value){
                        
     $id = $value['id'];
     $art_text = $value['art_text'];
     $anzahl = $value['anzahl'];
     $optional = $value['optional'];
     $fp = $value['fp'];
                        
     $stmt->execute();
}

$stmt->close();
$mysqli->close();

Kurz zur Erklärung. das Array $pos enthält mehrere Positionen mit mehreren Feldern. Eines dieser Felder ist 'art_text' und genau da habe ich das Problem bei der Eingabe von ' "
 
Wie sieht denn die Fehlermeldung aus/äußert sich der Fehler?

Und ein var_dump($art_text) wäre auch recht cool.
 
Nach ein paar Nachforschungen bin ich draufgekommen, dass die Werte nun richtig in die DB geschrieben werden. Sie wurden lediglich bei der Anzeige "geschluckt", da ich die Anzeige erst noch mit mysqli realisieren muss. Das werde ich jetzt machen und mich ggf. bei Problemen noch einmal hier melden.

Danke nochmals an alle!
 
Das Gemotze gilt all den Leuten, die ihn munter dabei unterstützen in die falsche Richtung zu laufen. Der erste Post von Oenone hat alle Fakten dazu kurz und klar gesagt. Das wurde ignoriert und damit ist auch ein etwas harscherer Ton angebracht.

Harscher Ton vielleicht, aber nicht auf diese Art und Weise.
 
Nach ein paar Nachforschungen bin ich draufgekommen, dass die Werte nun richtig in die DB geschrieben werden. Sie wurden lediglich bei der Anzeige "geschluckt", da ich die Anzeige erst noch mit mysqli realisieren muss.
Einfach je nach Anwendungsfall durch htmlentities() oder urlencode() jagen, wenn's aus der Datenbank kommt.

Numerische Werte immer type-casten (int), (float) etc.
 
Zurück
Oben