sql >> Database >  >> RDS >> Mysql

Wat is het PDO-equivalent van de functie mysql_real_escape_string?

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

BOB-zelfstudie voor MySQL-ontwikkelaars



  1. hoe om te gaan met accenten en vreemde tekens in een database?

  2. Libpuzzle Miljoenen plaatjes indexeren?

  3. Een prestatie-spiekbriefje voor PostgreSQL

  4. Wat is de beste manier om te controleren of iets bestaat met PDO