Cóż, nie ma żadnego!
Technicznie istnieje PDO::quote()
ale jest rzadko używany i nie jest odpowiednikiem mysql_real_escape_string()
Zgadza się! Jeśli już używasz PDO we właściwy sposób, zgodnie z dokumentacją przy użyciu przygotowanych wyciągów , to ochroni Cię przed wstrzyknięciem MySQL.
# Example:
Poniżej znajduje się przykład bezpiecznego zapytanie do bazy danych za pomocą przygotowanych instrukcji (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();
}
A teraz zakładając, że połączenie zostało nawiązane, możesz wykonać zapytanie w ten sposób.
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);
}
Teraz, jak prawdopodobnie wiesz, nie użyłem niczego do ucieczki/oczyszczenia wartości $_POST["color"]
. A ten kod jest zabezpieczony przed myql-injection dzięki PDO i mocy przygotowanych wyciągów.
Warto zauważyć, że powinieneś przekazać charset=utf8
jako atrybut, w Twoim DSN
jak widać powyżej, ze względów bezpieczeństwa i zawsze włączaj PDO, aby wyświetlać błędy w formie wyjątków.
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
więc błędy z zapytań do bazy danych nie ujawnią poufnych danych, takich jak struktura katalogów, nazwa użytkownika bazy danych itp.
Wreszcie, są chwile, kiedy nie powinieneś ufać PDO w 100% i będziesz musiał podjąć dodatkowe środki, aby zapobiec wstrzykiwaniu sql, jednym z tych przypadków jest, jeśli używasz przestarzałej wersji mysql [ mysql =< 5.3.6 ]
jak opisany w ta odpowiedź
Jednak użycie przygotowanych instrukcji, jak pokazano powyżej, będzie zawsze bezpieczniejsze niż użycie dowolnej funkcji, która zaczyna się od mysql_
Dobre lektury