2011-01-03 9 views
1

Erstens magische Anführungszeichen & Laufzeit sind in php.ini korrekt deaktiviert und durch phpinfo() bestätigt.mysql_real_escape_string & slashes

PHP version: 5.3.4 
MySQL version: 5.1.52 

Ich bin nur mysql_real_escape_string auf die Daten verwenden, nachdem htmlspecialchars und trim, ist, dass alle Daten auf der variablen Reinigung.

Wenn ich jedoch ein einfaches Angebot einreiche, bleibt der Schrägstrich in der Datenbank.

Wenn ich mysql_query läuft verwende ich "' . $var . '", obwohl in der Vergangenheit hat sich nichts geändert (könnte wegen der doppelten Anführungszeichen?).

Irgendwelche Ideen? und erzähle mir bitte nicht von PDO/vorbereiteten Aussagen, ich kenne sie und ich habe meine Gründe dafür.

Danke!

Code-Beispiel (dies ist die einzige auf die Daten erfolgt Sache):

mysql_real_escape_string(htmlspecialchars(trim($data))); 
+2

Können Sie einige Beispieldaten und -code zeigen? –

+0

Um es Ihnen zu sagen, mysql_real_escape_string reinigt nichts. Es ist nicht "Reinigungs" -Funktion überhaupt. Go figure –

+1

Könnten Sie vielleicht einen Code-Schnipsel geben, macht es viel einfacher, das Problem zu identifizieren. @ Col. Schrapnell: Nun, es entkommt Sonderzeichen, das könnte gesagt werden, ist ein "Reinigungs" -Prozess, denke, das ist die Frage der Interpretation, obwohl –

Antwort

3

ich nur mysql_real_escape_string auf die Daten verwenden bin, nach htmlspecialchars und trimmen, das ist alles, die Daten auf die Reinigung Variable.

Nr Nur Verwendung mysql_real_escape_string für Daten in der Datenbank zu speichern. Beschädigen Sie Ihre Daten nicht, wenn Sie sie speichern.

Die Funktion htmlspecialchars wird verwendet, um eine Zeichenfolge in HTML zu codieren (< wird &lt; etc.) und sollte nur für diesen Zweck verwendet werden.

+1

Das ist eine gültige Ansicht, aber nicht wirklich eine Antwort auf seine Frage, oder? –

+0

Dann müssen Sie daran denken, es mit htmlentities zu bereinigen, wenn Sie es aus der Datenbank zurückgeben und die Daten auf dem Frontend anzeigen möchten ... –

+0

@Pekka es ist eine Antwort. Wenn man so vorgeht und magische Anführungszeichen in Wirklichkeit hat, haben sie kein einziges Problem mit Schrägstrichen. –

1

Vielleicht ist der massiv fehlgeleiteten, nicht hilfreich und schädlich Option

magic_quotes_gpc 

aktiviert wurde?

Sie können dies in der Ausgabe von phpinfo() überprüfen, aber es gibt nicht viel, was Sie tun können, wenn der Server-Administrator es global ohne die Fähigkeit zum Überschreiben aktiviert hat.

Ich empfehle zu überprüfen, ob es (auf jeder Seite der App natürlich), und wenn ja, die Anwendung schnell und schmerzhaft zu sterben, um sicherzustellen, dass Sie Daten Korruption (die sich vor allem als die Verbreitung von Backslashes manifestiert du hast es beschrieben).

Dann gehen Sie mit einer stumpfen Waffe Ihrer Wahl zum Server-Admin-Haus.

Hoffentlich können Sie all dies tun, bevor Ihre Datenbank mit Scharen von bösen sich selbst multiplizierenden Backslashes überrannt wird.

+2

Er behauptet, es ausgeschaltet zu haben. –

+0

Es ist aus. Ich betreibe den Server, und es ist definitiv deaktiviert, es gibt keine Möglichkeit, dass ich diesen Müll zulassen würde. – Fizzadar

1

Ihre Speicherprozedur ist korrekt. (obwohl htmlspecialchars und/oder Trim ist wahrscheinlich nicht erforderlich - aber ich weiß nicht über Ihre Anwendung)

von den Informationen, die Sie zur Verfügung stellen gibt es keinen Grund für Ihr Problem gesehen werden.

Der nächste Debugging-Ansatz würde dann daran erinnern, was auch immer Sie geändert haben oder auf Ihrem System geändert wurde (maby verwenden Sie ein 3rd-Party-Installations-Image?).

wenn das fehlschlägt, dh auf wilde erraten mögliche Ursachen übrig ist, für das bieten i ein erster:

mysql in NO_BACKSLASH_ESCAPES -Mode ausgeführt werden, was Spielraümen verursachen würde als normale Zeichen behandelt werden.

Darüber hinaus sieht es so aus, als würden Sie Ihre Strings in doppelte Anführungszeichen setzen, die dann ein einfaches Anführungszeichen - das normalerweise mit Escapezeichen versehen wird - direkt in Ihre Datenbank einfügen, gefolgt von einem umgekehrten Schrägstrich.

es ist sehr wahrscheinlich auch möglich, dass - wie Sie Ihre Strings mit doppelten Anführungszeichen innerhalb Ihrer SQL-Anweisungen wickeln, die nicht so ist, wie es sein sollte, und ich bin verwirrt erhalten Sie keine Syntaxverletzung Fehler, Sie enden mit einer Abfrage wie "john\'s house", die durch das einfache Zitat aus mysql_real_escape verursacht wird, das korrekt wäre, wenn Sie Ihre Abfrage korrekt in einfache Anführungszeichen eingeschlossen hätten.

was mich zu der Frage führt. erhalten Sie einen Syntaxfehler (oder eine injizierte Abfrage), wenn Sie doppelte Anführungszeichen einfügen möchten?

wie für Ihren Kommentar. Sie könnten sehr gut Anweisungen mit pdo vorbereiten und dann die Abfragezeichenfolge daraus erzeugen und sie mit mysql-Funktionen ausführen. Aber ich verstehe, dass dies keine Lösung für Ihr Problem ist.

Bitte versuchen Sie auch, Ihre gesamte Abfrage in nur eine Variable zu setzen und diese direkt auszudrucken, bevor Sie sie ausführen. dann schaue es dir an und folge irgendeiner falschen Manipulation, um die Operation auszuführen, die ausgeführt wird, um die Zeichenkette zu erzeugen.

+0

+1 für NO_BACKSLASH_ESCAPES Vorschlag. –

0

Wenn Sie doppelte Anführungszeichen verwenden innerhalb die SQL-Befehle, nachdem die Daten zu entkommen:

SELECT "1\'2" 

dann wird es speichern und den Wert als 1\'2 mit dem umgekehrten Schrägstrich noch intakt zurück.

Die richtige Syntax für SQL-Strings verwendet einfache Anführungszeichen. Das ist, was mysql_real_escape_string für entgeht. Sonst müsste es doppelten Anführungszeichen entgehen, deren Verwendung jedoch völlig unbekannt ist.

Verwenden Sie doppelte Anführungszeichen in PHP. Verwenden Sie einfache Anführungszeichen für SQL. Schreiben Sie Ihren Code so um:

$x = escapy($x); 
$y = escapy($y); 
sql_query("INSERT INTO tbl (x,y) VALUES ('$x', '$y')"); 
+0

'SELECT" 1 \ '2 "' gibt '1'2' für mich zurück - kein Backslash. –

+0

@MarkByers: Nicht mit My getestet. Habe gerade SQLite ausprobiert, welches dieses Verhalten aufweist. Und scheint immer noch am ehesten von seinem einzigen Code-Schnipsel. – mario

Verwandte Themen