Е, не, няма такъв!
Технически има PDO::quote()
но рядко се използва и не е еквивалент на mysql_real_escape_string()
Точно така! Ако вече използвате PDO по правилния начин, както е документирано с помощта на подготвени отчети , тогава ще ви предпази от MySQL инжектиране.
# Example:
По-долу е даден пример за сейф заявка за база данни с помощта на подготвени оператори (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();
}
И сега, ако приемем, че връзката е установена, можете да изпълните заявката си по този начин.
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);
}
Сега, както вероятно можете да разберете, не съм използвал нищо за избягване/дезинфекция на стойността на $_POST["color"]
. И този код е защитен от myql-инжекция благодарение на PDO и силата на подготвените оператори.
Струва си да се отбележи, че трябва да подадете charset=utf8
като атрибут във вашия DSN
както се вижда по-горе, от съображения за сигурност и винаги позволявайте на PDO да показва грешки под формата на изключения.
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
така че грешките от вашите заявки за база данни няма да разкрият чувствителни данни като структурата на вашата директория, потребителско име на базата данни и т.н.
Не на последно място, има моменти, в които не трябва да се доверявате на PDO 100% и ще трябва да предприемете някои допълнителни мерки за предотвратяване на sql инжектиране, един от тези случаи е, ако използвате остарели версии на mysql [ mysql =< 5.3.6 ]
както описано в този отговор
Но използването на подготвени оператори, както е показано по-горе, винаги ще бъде по-безопасно, отколкото използването на която и да е от функциите, които започват с mysql_
Добро четиво