Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Was ist das PDO-Äquivalent der Funktion mysql_real_escape_string?

Nun, nein, es gibt keine!

Technisch gesehen gibt es PDO::quote() aber es wird selten verwendet und ist nicht das Äquivalent zu mysql_real_escape_string()

Richtig! Wenn Sie PDO bereits richtig verwenden, wie es mit vorbereiteten Anweisungen dokumentiert ist , dann schützt es Sie vor MySQL-Injektion.

# Example:

Unten sehen Sie ein Beispiel für einen Safe Datenbankabfrage mit vorbereiteten Anweisungen (pdo)

  try {
     // first connect to database with the PDO object. 
     $db = new \PDO("mysql:host=localhost;dbname=xxx;charset=utf8", "xxx", "xxx", [
       PDO::ATTR_EMULATE_PREPARES => false, 
       PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
     ]); 
 } catch(\PDOException $e){
     // if connection fails, show PDO error. 
   echo "Error connecting to mysql: " . $e->getMessage();
 }

Und, vorausgesetzt, die Verbindung ist jetzt hergestellt, können Sie Ihre Abfrage so ausführen.

if($_POST && isset($_POST['color'])){ 

    // preparing a statement
    $stmt = $db->prepare("SELECT id, name, color FROM Cars WHERE color = ?");

    // execute/run the statement. 
    $stmt->execute(array($_POST['color']));

    // fetch the result. 
    $cars = $stmt->fetchAll(\PDO::FETCH_ASSOC); 
    var_dump($cars); 
 }

Nun, wie Sie wahrscheinlich sehen können, habe ich nichts verwendet, um den Wert von $_POST["color"] zu maskieren/zu bereinigen . Und dieser Code ist dank PDO und der Macht vorbereiteter Anweisungen sicher vor myql-injection.

Es ist erwähnenswert, dass Sie ein charset=utf8 übergeben sollten als Attribut, in Ihrem DSN wie oben gesehen, aus Sicherheitsgründen, und ermöglichen Sie PDO immer, Fehler in Form von Ausnahmen anzuzeigen.

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

Fehler aus Ihren Datenbankabfragen werden also keine sensiblen Daten wie Ihre Verzeichnisstruktur, Ihren Datenbank-Benutzernamen usw. preisgeben.

Zu guter Letzt gibt es Momente, in denen Sie PDO nicht zu 100 % vertrauen sollten und einige zusätzliche Maßnahmen ergreifen müssen, um eine SQL-Einschleusung zu verhindern. Einer dieser Fälle ist, wenn Sie eine veraltete Version von mysql [ mysql =< 5.3.6 ] wie beschrieben in diese Antwort

Die Verwendung vorbereiteter Anweisungen wie oben gezeigt ist jedoch immer sicherer als die Verwendung einer der Funktionen, die mit mysql_ beginnen

Gute Lektüre

PDO-Tutorial für MySQL-Entwickler