Sven Rautenberg: Schwieriges Problem mit addslashes()

Beitrag lesen

Moin!

ich habe ein äußerst hinterlistiges Problem:

Eigentlich nicht.

Um einen String in eine mySQL-Datenbank zu schreiben, schütze ich diesen zuvor mit addslashes().

Und das ist schon mal falsch. Verwende immer und ausschließlich mysql_real_escape_string().

Sehe ich mir den Inhalt der Datenbank sogleich an, sehe ich, dass die Backslashes erfolgreich hinzugefügt wurden um ersichtlich sind.

Und das ist auch falsch, denn die Backslashes sollten durch den SQL-Parser erkannt und aus den in die DB eingetragenen Daten entfernt worden sein. Wenn du die Daten wieder ausliest, sollen eben gerade KEINE Backslashes mehr zu sehen sein - jedenfalls nicht die, die durch das Escaping eingetragen wurden - wenn in den Daten Backslashes vorkommen,  müssen die natürlich erhalten bleiben.

Ich habe jetzt bei einem Projekt eine Art Datenbank-Backup mit Hilfe des Dateisystems implementiert. D.h. im Groben, dass ich die Datenbank auslese, in CREATE- und INSERT-Befehle umwandle und diese in einer Datei ablege. Sehe ich mir diese Datei mit einem Wordpad an, stehen hier auch noch korrekterweise die Backslashes an der gewünschten Position dabei.

In dieser Datei, die fertige SQL-Befehle enthält, müssen die Escape-Zeichen natürlich wieder auftauchen.

Will ich diese Datei nun wieder importieren, lösche ich zuerst sämtliche Tabellendefinitionen der Datenbank und führe die in der Datei befindlichen SQL-Anweisungen aus. Jetzt ist da allerdings das Problem aufgetaucht, dass er beim einlesen der Datei in mein PHP-Skript irgendein grausiges Spiel mit meinen Backslashes treibt. Das komische daran ist, dass er sie nicht ganz weglässt, sonst würde bereits dieser Vorgang einen mySQL-Fehler nach sich ziehen. Aber nach dem INSERT sind diese Escape-Backslashes in der Datenbank nicht mehr vorhanden.

Dann hast du ein Problem mit korrektem Escaping.

D.h. kommt es nun zu einem weiteren Export und wiederum Import, stehe ich vor dem Fehler, dass die Strings nicht mehr mit Backslashes geschützt sind.

Klarer Fall von "Ein Escaping zu wenig" - was wiederum darauf hindeutet, dass dein normaler Mechanismus offenbar dieses Escaping zusätzlich macht - und das deutet wiederum darauf hin, dass du wahrscheinlich auf einem PHP-System arbeitest, bei dem magic_quotes_gpc eingeschaltet ist und dir somit alle Daten, die per Formular gesendet werden, schon mal automatisch mit einem Escaping versehen werden.

Das erklärt auch, warum du nach addslashes() immer noch Slashes in der DB siehst.

  • Schalte magic_quotes_gpc ab!
  • Füge alle Daten, die aus einer Stringvariablen kommen und in ein SQL-Statement integriert werden, ausschließlich mittels mysql_real_escape_string() ein.
  • Füge alle Werte, auch Zahlen, immer in einfachen Anführungszeichen in den SQL-String ein. SQL unterscheidet da nicht zwischen Zahlenwerten und Strings, bzw. wandelt bei Bedarf die Typen automatisch.

Für den Export in SQL-Statements gilt vor dem Speichern des fertigen INSERT dasselbe.

- Sven Rautenberg

--
"Love your nation - respect the others."