web-dev-qa-db-fra.com

Quel est l'équivalent PDO de la fonction mysql_real_escape_string?

Je modifie mon code en utilisant mysql_* à PDO. Dans mon code, j'avais mysql_real_escape_string(). Quel est l'équivalent de cela dans le PDO?

37
REJOLA

Eh bien non, il n'y en a pas!

Techniquement, il existe PDO::quote() mais il est rarement utilisé et n’est pas l’équivalent de mysql_real_escape_string()

C'est vrai! Si vous utilisez déjà PDO de la manière appropriée, documentée à l'aide de instructions préparées , elle vous protégera contre l'injection MySQL. 


# Example:

Vous trouverez ci-dessous un exemple de requête de base de données sécurisée à l'aide d'instructions préparées (pdo). 

  try {
     // first connect to database with the PDO object. 
     $db = new \PDO("mysql:Host=localhost;dbname=xx;charset=utf8", "xx", "xx", [
       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();
 }

Et, maintenant que la connexion est établie, vous pouvez exécuter votre requête de la manière suivante. 

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

Maintenant, comme vous pouvez probablement le constater, je n'ai rien utilisé pour échapper à la valeur de $_POST["color"] et l'assainir. Et ce code est sécurisé de myql-injection grâce à PDO et à la puissance des instructions préparées. 


Il convient de noter que pour des raisons de sécurité, vous devez passer un attribut charset=utf8 en tant qu'attribut, dans la variable DSN, comme indiqué ci-dessus, et toujours activer PDO pour afficher des erreurs sous la forme d'exceptions.

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

ainsi, les erreurs de vos requêtes de base de données ne révéleront pas de données sensibles telles que la structure de votre répertoire, votre nom d'utilisateur de base de données, etc. 

Dernier point mais non le moindre, il y a des moments où vous ne devriez pas faire confiance à PDO à 100% et que vous devrez prendre des mesures supplémentaires pour empêcher l'injection de SQL, un de ces cas est, si vous utilisez une version obsolète de mysql [ mysql =< 5.3.6 ] comme décrit dans cette réponse

Mais, utiliser les instructions préparées comme indiqué ci-dessus sera toujours plus sûr que d'utiliser l'une des fonctions commençant par mysql_

Bonne lecture

Tutoriel PDO pour les développeurs MySQL

61
samayo

Il n'y en a pas*! L’objet du PDO est que vous n’échappiez à rien; vous venez de l'envoyer sous forme de données. Par exemple:

$query = $link->prepare('SELECT * FROM users WHERE username = :name LIMIT 1;');
$query->execute([':name' => $username]); # No need to escape it!

Par opposition à:

$safe_username = mysql_real_escape_string($username);
mysql_query("SELECT * FROM users WHERE username = '$safe_username' LIMIT 1;");

* Bien, il y en a un, comme l'a dit Michael Berkowski! Mais il y a de meilleures façons.

26
Ry-
$v = '"'.mysql_real_escape_string($v).'"'; 

est l'équivalent de $v = $this->db->quote($v);be que vous avez une instance de PDO dans $this->db pour pouvoir appeler la méthode pdo quote()

5
Simo

Il n'y a pas besoin de mysql_real_escape_string dans PDO. 

PDO lui-même ajuste le caractère spécial dans la requête mysql, il vous suffit de passer un paramètre anonyme et de le lier au moment de l’exécution. ceci vous pouvez passer name en tant que => $ name = "Rajes'h";

il devrait exécuter il n'y a pas besoin d'équivalent de mysql_real_escape_string

$stmt="INSERT into user(name,email,password) VALUES(:name,:email,password)";
try{
   $pstmt=$dbh->prepare($stmt);//$dbh database handler for executing mysql query
   $pstmt->bindParam(':name',$name,PDO::PARAM_STR);
   $pstmt->bindParam(':email',$email,PDO::PARAM_STR);
   $pstmt->bindParam(':password',$password,PDO::PARAM_STR);
   $status=$pstmt->execute();
   if($status){
    //next line of code 
   }


}catch(PDOException $pdo){
     echo $pdo->getMessage();
}
0
IMRA