Nou nee, die is er niet!
Technisch gezien is er PDO::quote()
maar het wordt zelden gebruikt en is niet het equivalent van mysql_real_escape_string()
Dat klopt! Als u PDO al op de juiste manier gebruikt, zoals gedocumenteerd met behulp van voorbereide verklaringen , dan zal het u beschermen tegen MySQL-injectie.
# Example:
Hieronder ziet u een voorbeeld van een kluis databasequery met behulp van voorbereide instructies (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();
}
En, ervan uitgaande dat de verbinding tot stand is gebracht, kunt u uw query als volgt uitvoeren.
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);
}
Zoals je waarschijnlijk wel kunt zien, heb ik niets gebruikt om de waarde van $_POST["color"]
te ontwijken/op te schonen. . En deze code is beveiligd tegen myql-injectie dankzij PDO en de kracht van voorbereide verklaringen.
Het is vermeldenswaard dat u een charset=utf8
. moet doorgeven als attribuut, in uw DSN
zoals hierboven te zien, om veiligheidsredenen, en schakel PDO altijd in om fouten in de vorm van uitzonderingen weer te geven.
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
dus fouten van uw databasequery's zullen geen gevoelige gegevens onthullen, zoals uw directorystructuur, database-gebruikersnaam enz.
Last but not least, er zijn momenten waarop u PDO niet 100% moet vertrouwen en u verplicht bent extra maatregelen te nemen om sql-injectie te voorkomen, een van die gevallen is, als u een verouderde versie van mysql gebruikt [ mysql =< 5.3.6 ]
zoals beschreven in dit antwoord
Maar het gebruik van voorbereide instructies zoals hierboven weergegeven, is altijd veiliger dan het gebruik van een van de functies die beginnen met mysql_
Goed gelezen