2009-05-14 20 views
2

Ich machte ein einfaches Nachrichtensystem mit Kommentaren mit PHP und MySQL, und es funktionierte großartig auf meinem lokalen Apache-Server, sowohl auf meinem Fedora 10, als auch auf meinem Windows 7 ein Problem, obwohl ich es auf einen Web-Host hochgeladen und es alle "und" as \ 'und \ "zurückgibt.
Ich glaube, das ist entweder der Web-Host, der durch automatische fügt sie aus Sicherheitsgründen oder dass die MySQL Sortierungs ist der falsche, aber ich habe nicht in der Lage gewesen, es noch zu lösen, mehrere MySQL-Sortierungen testen

Hier ist ein Beispiel für eine Abfrage ist.MySQL/PHP Problem mit "und '

mysql_query("INSERT INTO news (title, poster, text, time) VALUES ('$newstitle', '1', '$newstext', '$time')") or die(mysql_error()); 

$time ist time(); $newstitle und $newstext aus $_POST analysiert und beide laufen durch mysql_real_escape_string(), bevor ich die Abfrage ausführen (Ich denke, das könnte das Problem sein, aber da es ein Teil der Sicherheit ist, ich will nur nicht, es entfernen , und da es auf meinen lokalen Servern keine Probleme verursachte)

Als letzte Anmerkung: Auf meinen lokalen Apache-Servern hatte ich latin1_swedish_ci, die auf dem Webhosts-Server nicht funktionierte.

EDIT:

Sie sehen aus wie diese in der Datenbank:

\'\'\'\"\"\" 

Während auf meinen lokal diejenigen, die sie nicht über die zusätzliche Backslash, so dass es die PHP es hinzugefügt werden muss. Gibt es eine Möglichkeit, dies zu lösen, außer eine Funktion hinzuzufügen, die zusätzliche Backslashes entfernt?

+0

Ich glaube, ich habe es schon getan: P Oder habe ich es falsch gemacht? – user106546

+0

Wie ich in dem Kommentar zu meiner eigenen Antwort gesagt habe, wäre es besser, wenn Sie sich für Gumbos Antwort entschieden hätten, da er als erster die * richtige * Lösung gefunden hat, anstatt eine 'nicht-wirklich-Lösung' 'Lösung;) –

Antwort

7

Diese zusätzlichen Backslashes sind wahrscheinlich Magic Quotes. Versuchen Sie es mit disable them or remove them, bevor Sie die Daten verarbeiten.

+0

Dies ist eigentlich die richtige Antwort - mysql_real_escape_string wird die Zeichen entkommen, so dass Sie sie einfügen können, aber diese Escapes werden nicht da sein beim Zurückziehen von Daten aus der Datenbank. – Rytmis

4

Bearbeiten: Wie bereits mehrmals erwähnt, und in Kommentaren, ist der richtige Weg, um dies zu deaktivieren, magische Anführungszeichen zu deaktivieren. Hätte ich vollständig gelesen und verstanden die Frage, bevor er antwortete, dann wäre das wahrscheinlich besser gewesen;)


mysql_real_escape_string() tun werden, was sie sagt, und die entsprechenden Zeichen in der Zeichenfolge zu entkommen. Escape-Anführungszeichen werden getan, indem ihnen das Escape-Zeichen vorangestellt wird (ein Schrägstrich in PHP und viele andere Sprachen). Wenn Sie die Daten aus der Datenbank zurückziehen, tun Sie etwas wie stripslashes() (siehe PHP doc) auf den Inhalt, um die Schrägstriche von Dingen wie Anführungszeichen zu entfernen.

bearbeitet: Wie Gumbo erwähnt, könnte es auch durch Magie seiner Zitate auf dem Server aktiviert werden. Sie sollten diese as per his answer deaktivieren.

+0

Warum musste ich das nicht mit meinem lokalen Server machen? Nur neugierig, da es der gleiche Code ist (außer für mysql Details) ... – user106546

+1

Ihr lokaler Server hat wahrscheinlich magic_quotes_gpc = aus, während ihr Server magic_quotes_gpc = on hat. – Powerlord

+1

Gerade den Post bearbeitet, könnte es sein, dass Magic Quotes aktiviert wurden (Hut-Tipp zu Gumbo für die Erinnerung). –

2

Betrachten Sie magic_quotes_gpc. Sie können dies über .htaccess ausschalten und mysql_real_escape_string() verwenden.

4

Nein, Sie möchten nicht stripslashes() ausführen. Richten Sie Ihren Server stattdessen richtig ein.

Schalten Sie zuerst magic_quotes aus. Dies bedeutet, dass für alle Daten, die in Ihr Skript gelangen, nichts entgangen ist.

Führen Sie dann mysql_real_escape_string() für die Daten aus, die die Schrägstriche nur für die Abfrage hinzufügen und die Daten in der Datenbank ohne Schrägstriche speichern.

Wenn Sie die Daten erneut laden, sind Sie gut dran und es wird keine Backslashes um die Anführungszeichen geben.

+0

+1 der richtige Weg, um dies zu beheben. :-) – Rytmis

3

Werfen Sie einen Blick auf Ihre magic_quotes Einstellungen, und vergleichen Sie sie auf Ihren Servern. Ihre Home-Server haben wahrscheinlich magic_quotes deaktiviert (wie sie sein sollten, seit Magic Quotes is deprecated in aktuellen Versionen von PHP), und Ihr Web-Host hat wahrscheinlich aktiviert sie (was leider häufig ist). Sie können verwenden:

<?php echo phpinfo(); ?> 

für einen schnellen Vergleich.

Wenn magic_quotes für Sie neu ist, sollten Sie sich die PHP-Sicherheit noch etwas genauer ansehen, bevor Sie etwas bereitstellen, das Ihnen wichtig ist.

Questions containing "magic_quotes"

-1

Die wirkliche Lösung ist vorbereitete Anweisungen in Ihrem Einsatz von Abfragen zu verwenden.

Hier ist eine Seite mit einem Beispiel zum Einfügen ganz oben.

Prepared Statements in PHP

Der Vorteil ist, dass es eine bewährte Methode ist, und der Nebeneffekt ist, dass Sie nicht mehr über die Reinigung den Eingangs gegen SQL-Injection-Angriffe zu kümmern.

+0

Nein. Das Problem waren unerwünschte zusätzliche Backslashes. – Gumbo

+0

Ja, aber das verhindert, dass sie jemals reinkommen. Mit einem kleinen Code ist es einfach, sie in den vorhandenen Daten zu bereinigen. Wenn die Einsätze richtig ausgeführt werden, wird das Problem nicht erneut auftreten. – ShawnMilo

+0

Nein. Die zusätzlichen Backslashes wurden von Magic Quotes verursacht und nicht von mysql_real_escape_string.So vorbereitete Anweisungen würden keinen Unterschied machen, da die Backslashes bereits von Magic Quotes hinzugefügt wurden. – Gumbo