sql >> Base de Datos >  >> RDS >> Mysql

¿Cuál es el equivalente PDO de la función mysql_real_escape_string?

¡Pues no, no hay ninguno!

Técnicamente hay PDO::quote() pero rara vez se usa y no es el equivalente de mysql_real_escape_string()

¡Así es! Si ya está usando PDO de la manera correcta, como se documenta usando declaraciones preparadas , entonces lo protegerá de la inyección de MySQL.

# Example:

A continuación se muestra un ejemplo de una caja fuerte consulta de base de datos usando declaraciones preparadas (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();
 }

Y, ahora que se establece la conexión, puede ejecutar su consulta de esta manera.

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

Ahora, como probablemente se dará cuenta, no he usado nada para escapar/desinfectar el valor de $_POST["color"] . Y este código está seguro de la inyección myql gracias a PDO y el poder de las declaraciones preparadas.

Vale la pena señalar que debe pasar un charset=utf8 como atributo, en tu DSN como se vio anteriormente, por razones de seguridad, y siempre habilite PDO para mostrar errores en forma de excepciones.

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

por lo que los errores de sus consultas a la base de datos no revelarán datos confidenciales como la estructura de su directorio, el nombre de usuario de la base de datos, etc.

Por último, pero no menos importante, hay momentos en los que no debe confiar en PDO al 100%, y estará obligado a tomar algunas medidas adicionales para evitar la inyección de sql, uno de esos casos es, si está utilizando una versión obsoleta de mysql [ mysql =< 5.3.6 ] como descrito en esta respuesta

Pero, usar declaraciones preparadas como se muestra arriba siempre será más seguro que usar cualquiera de las funciones que comienzan con mysql_

Buenas lecturas

Tutorial de PDO para desarrolladores de MySQL