it-swarm.com.de

Was ist das PDO-Äquivalent der Funktion mysql_real_escape_string?

Ich ändere meinen Code mit mysql_* in PDO. In meinem Code hatte ich mysql_real_escape_string(). Was ist das Äquivalent in PDO?

37
REJOLA

Nun, nein, es gibt keine!

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

Das ist richtig! Wenn Sie PDO bereits auf die richtige Art und Weise verwenden, wie mit vorbereitete Anweisungen dokumentiert, werden Sie vor MySQL geschützt Injektion.


# Example:

Unten sehen Sie ein Beispiel für eine sichere 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();
 }

Wenn die Verbindung nun hergestellt ist, können Sie Ihre Abfrage folgendermaßen 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); 
 }

Wie Sie wahrscheinlich feststellen können, habe ich nichts verwendet, um den Wert von $_POST["color"] zu entkommen/zu bereinigen. Und dieser Code ist dank PDO und der Kraft der vorbereiteten Anweisungen vor MyQL-Injection geschützt.


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

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

fehler aus Ihren Datenbankabfragen lassen daher keine vertraulichen Daten wie Verzeichnisstruktur, Datenbank-Benutzername usw. erkennen.

Last but not least gibt es Momente, in denen Sie PDO nicht 100% vertrauen sollten und einige zusätzliche Maßnahmen ergreifen müssen, um SQL-Injection zu verhindern. Einer dieser Fälle ist, wenn Sie eine veraltete Version von mysql verwenden: [ mysql =< 5.3.6 ] as - in dieser Antwort beschrieben

Die Verwendung der oben gezeigten vorbereiteten Anweisungen ist jedoch immer sicherer als die Verwendung einer der Funktionen, die mit mysql_ beginnen.

Gut liest

PDO Tutorial für MySQL Entwickler

65
samayo

Da ist gar nichts*! Das Ziel der PDO ist, dass Sie nichts entkommen müssen. Sie senden es einfach als Daten. Zum Beispiel:

$query = $link->prepare('SELECT * FROM users WHERE username = :name LIMIT 1;');
$query->execute([':name' => $username]); # No need to escape it!

Im Gegensatz zu:

$safe_username = mysql_real_escape_string($username);
mysql_query("SELECT * FROM users WHERE username = '$safe_username' LIMIT 1;");

* Nun, es gibt einen, wie Michael Berkowski sagte! Aber es gibt bessere Wege.

26
Ry-
$v = '"'.mysql_real_escape_string($v).'"'; 

ist das Äquivalent von $v = $this->db->quote($v);. Stellen Sie sicher, dass Sie eine PDO-Instanz in $this->db haben, so dass Sie die pdo-Methode quote() aufrufen können.

5
Simo

Mysql_real_escape_string ist in PDO nicht erforderlich. 

PDO selbst passt Sonderzeichen in mysql query an, Sie müssen nur anonyme Parameter übergeben und die Laufzeit binden. Beispiel: ___. Angenommen, Sie haben eine Benutzertabelle mit Attributnamen, E-Mail-Adresse und Kennwort, und Sie müssen diese Anweisung verwenden this Sie können name als => $ name = "Rajes'h" übergeben;

es sollte ausgeführt werden, es ist kein Äquivalent von mysql_real_escape_string erforderlich

$stmt="INSERT into user(name,email,password) VALUES(:name,:email,password)";
try{
   $pstmt=$dbh->prepare($stmt);//$dbh database handler for executing mysql query
   $pstmt->bindParam(':name',$name,PDO::PARAM_STR);
   $pstmt->bindParam(':email',$email,PDO::PARAM_STR);
   $pstmt->bindParam(':password',$password,PDO::PARAM_STR);
   $status=$pstmt->execute();
   if($status){
    //next line of code 
   }


}catch(PDOException $pdo){
     echo $pdo->getMessage();
}
0
IMRA