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

Qual è l'equivalente PDO della funzione mysql_real_escape_string?

Ebbene No, non c'è!

Tecnicamente esiste PDO::quote() ma è usato raramente e non è l'equivalente di mysql_real_escape_string()

Esatto! Se stai già utilizzando PDO nel modo corretto, come documentato utilizzando dichiarazioni preparate , quindi ti proteggerà dall'iniezione di MySQL.

# Example:

Di seguito è riportato un esempio di cassaforte query del database utilizzando istruzioni preparate (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();
 }

E, ora supponendo che la connessione sia stabilita, puoi eseguire la tua query in questo modo.

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

Ora, come probabilmente puoi dire, non ho usato nulla per sfuggire/disinfettare il valore di $_POST["color"] . E questo codice è protetto da myql-injection grazie a PDO e alla potenza delle istruzioni preparate.

Vale la pena notare che dovresti passare un charset=utf8 come attributo, nel tuo DSN come visto sopra, per motivi di sicurezza, e abilita sempre PDO a mostrare errori sotto forma di eccezioni.

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

quindi gli errori delle query del database non riveleranno dati sensibili come la struttura della directory, il nome utente del database ecc.

Ultimo ma non meno importante, ci sono momenti in cui non dovresti fidarti di PDO al 100% e sarai obbligato a prendere alcune misure extra per prevenire l'iniezione di sql, uno di questi casi è, se stai usando una versione obsoleta di mysql [ mysql =< 5.3.6 ] come descritto in questa risposta

Tuttavia, l'utilizzo di istruzioni preparate come mostrato sopra sarà sempre più sicuro rispetto all'utilizzo di una qualsiasi delle funzioni che iniziano con mysql_

Buone letture

Tutorial PDO per sviluppatori MySQL