Ich ändere meinen Code mit mysql_*
in PDO
. In meinem Code hatte ich mysql_real_escape_string()
. Was ist das Äquivalent in PDO?
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
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.
$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.
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();
}