sql >> Database teknologi >  >> RDS >> Mysql

Hvad er PDO-ækvivalenten til funktionen mysql_real_escape_string?

Nå nej, der er ingen!

Teknisk set er der PDO::quote() men det er sjældent nogensinde brugt og svarer ikke til >mysql_real_escape_string()

Det er rigtigt! Hvis du allerede bruger PDO på den rigtige måde som dokumenteret ved hjælp af forberedte erklæringer , så vil det beskytte dig mod MySQL-injektion.

# Example:

Nedenfor er et eksempel på et pengeskab databaseforespørgsel ved hjælp af forberedte sætninger (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();
 }

Og nu, forudsat at forbindelsen er etableret, kan du udføre din forespørgsel på denne måde.

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 sikkert kan se, har jeg ikke brugt noget til at undslippe/sanere værdien af ​​$_POST["color"] . Og denne kode er sikker fra myql-injection takket være PDO og kraften i forberedte udsagn.

Det er værd at bemærke, at du skal bestå en charset=utf8 som attribut i din DSN som set ovenfor, af sikkerhedsmæssige årsager, og gør det altid muligt for PDO at vise fejl i form af undtagelser.

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

så fejl fra dine databaseforespørgsler vil ikke afsløre følsomme data som din mappestruktur, databasebrugernavn osv.

Sidst, men ikke mindst, er der øjeblikke, hvor du ikke bør stole 100% på PDO, og vil være forpligtet til at tage nogle ekstra foranstaltninger for at forhindre sql-injektion, et af disse tilfælde er, hvis du bruger en forældet version af mysql [ mysql =< 5.3.6 ] som beskrevet i dette svar

Men at bruge forberedte sætninger som vist ovenfor vil altid være sikrere end at bruge nogen af ​​de funktioner, der starter med mysql_

God læsning

PDO-vejledning til MySQL-udviklere



  1. Udførelsesrækkefølge for SQL-forespørgslen

  2. Hvad er den bedste måde at bruge LEFT OUTER JOIN til at kontrollere, om der ikke findes relaterede rækker

  3. Introduktion af afspilning – Nyt tidspunkt diagnose for Spotlight Cloud

  4. Problemer med at oprette forbindelse til mysql-server:ERROR 2003 (HY000)