2010-09-15 13 views
54

Ich benutze PDO nach der Migration weg von der MySQL-Bibliothek. Was verwende ich anstelle der alten real_escape_string Funktion?echte Escapesequenz und PDO

Ich muss einfachen Anführungszeichen entkommen, so dass sie in meine Datenbank gehen und ich denke, dass es einen besseren Weg geben kann, dies ohne Hinzufügen von Schrägstrichen zu allen meinen Strings zu behandeln. Kann mir jemand sagen, was ich benutzen soll?

+1

Ein bisschen spät, um die Partei, aber man konnte PDO :: quote(), wenn Die prepare() -Methode ist keine Option (zum Beispiel, wenn Sie ein eigenes Modell erstellt haben) –

Antwort

30

Sie PDO Prepare

Von dem Link verwendet werden sollen:

Aufruf PDO :: prepare() und PDOStatement :: execute() für Aussagen, die mehrfach mit unterschiedlichen Parameterwerten optimieren die ausgegeben werden Leistung der Anwendung, indem der Treiber das client- und/oder serverseitige Zwischenspeichern des Abfrageplans und der Metainformationen aushandeln kann und SQL-Injection-Angriffe verhindert, da die Parameter nicht manuell zitiert werden müssen.

+0

Danke SteD. Ich habe das vor einiger Zeit gelesen, aber ich habe seitdem gehört, dass PDO Prepare NICHT gegen SQL-Injection vorbeugen wird. Ich bin mir nicht sicher, was ich glauben soll. Sind Sie sicher, dass Prepare die Injektion stoppt? – John

+1

@John das erste Mal höre ich jemanden gehört, dass PDO vorbereiten wird nicht gegen SQL-Injektion verhindern. Bist du sicher, dass du das wirklich gehört hast? Ist Ihre Quelle zuverlässiger als offizielle Dokumentation? Und beachten Sie, es gibt immer einen anderen Weg, als jemanden zu fragen - Sie können selbst recherchieren ... –

+4

PDO verhindert SQL Injection. (Es hilft nicht, xss vunerabilities zu verhindern, aber auch nicht mysql_real_escape) – nos

4

Vorbereitete Anweisungen verwenden. Diese unterscheiden die Daten und die Syntax, wodurch die Notwendigkeit, MySQL-Daten zu umgehen, entfällt. Siehe z.B. this tutorial.

+0

Piskvor, danke. Ich benutze sie schon einfach nicht, wo ich die Fehler bekomme. Ich habe mich nur gefragt, ob Prepare wirklich Injektionen stoppt. Ich habe das Gegenteil gehört und es scheint eine Menge Debatte darüber zu geben. – John

+1

@John: Ja, vorbereitete Anweisungen werden SQL Injection-Angriffe stoppen. (Natürlich sind SQL-Injektionen nur ein möglicher Angriffsvektor, sie zu verhindern ist also keine magische "poof-your-website-is-now-all-secure" Staub) – Piskvor

+1

@John gibt es keine einzige Debatte. Eigentlich diskutieren nur Sie darüber. –

23

PDO bietet eine Alternative entwickelt mysql_escape_string() mit der PDO::quote() Methode zu ersetzen. Hier

ist ein Auszug aus der PHP-Website:

<?php 
    $conn = new PDO('sqlite:/home/lynn/music.sql3'); 

    /* Simple string */ 
    $string = 'Nice'; 
    print "Unquoted string: $string\n"; 
    print "Quoted string: " . $conn->quote($string) . "\n"; 
?> 

Der obige Code gibt:

Unquoted string: Nice 
Quoted string: 'Nice' 
+6

Ich bin gerade dabei, alten Code zu migrieren, um PDO zu verwenden, und während die Lösung ein guter ist, müssen sich die Leute der Tatsache bewusst sein, dass sie Zitate um den String herum platziert. Wenn also Leute Abfragen erstellen, die bereits Zitate wie "SELECT * FROM users WHERE username = '" haben. $ Conn-> quote ($ username). "'"; ', Werden die Abfragen unweigerlich fehlschlagen. – user3158900

+5

Die akzeptierte Antwort könnte der empfohlene Weg und die beste Vorgehensweise sein, aber diese Antwort ist die richtige Antwort auf die eigentliche Frage. Manchmal benötigen Sie tatsächlich die alte mysql_escape_string-Funktion, zum Beispiel, wenn Sie eine Datei erstellen, die später ausgeführt werden soll. Das kann man nicht mit einer vorbereiteten Aussage machen. –