sql >> Databasteknik >  >> RDS >> Mysql

Vad är PDO-motsvarigheten till funktionen mysql_real_escape_string?

Nej, det finns ingen!

Tekniskt sett finns det PDO::quote() men det används sällan någonsin och motsvarar inte strong>mysql_real_escape_string()

Det stämmer! Om du redan använder PDO på rätt sätt som dokumenterats med förberedda uttalanden , då kommer det att skydda dig från MySQL-injektion.

# Example:

Nedan är ett exempel på ett safe databasfråga med förberedda satser (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();
 }

Och nu, förutsatt att anslutningen är upprättad, kan du utföra din fråga så här.

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); 
 }

Nu, som du säkert förstår, har jag inte använt något för att escape/sanera värdet på $_POST["color"] . Och den här koden är säker från myql-injektion tack vare PDO och kraften i förberedda uttalanden.

Det är värt att notera att du ska skicka en charset=utf8 som attribut, i din DSN som ses ovan, av säkerhetsskäl, och gör alltid det möjligt för PDO att visa fel i form av undantag.

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

så att fel från dina databasfrågor inte avslöjar känsliga data som din katalogstruktur, databasanvändarnamn etc.

Sist men inte minst, det finns tillfällen då du inte bör lita på PDO 100% och kommer att vara skyldig att vidta några extra åtgärder för att förhindra sql-injektion, ett av dessa fall är om du använder en föråldrad version av mysql [ mysql =< 5.3.6 ] som beskrivs i det här svaret

Men att använda förberedda satser som visas ovan kommer alltid att vara säkrare än att använda någon av funktionerna som börjar med mysql_

Bra läsning

PDO-handledning för MySQL-utvecklare



  1. Hur låser jag på en InnoDB-rad som inte finns ännu?

  2. SQL Group BY, Top N artiklar för varje grupp

  3. Skicka fil med postman till Laravel API

  4. Konfigurationsparameter work_mem i PostgreSQL på Linux