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