Mysql
 sql >> Base de données >  >> RDS >> Mysql

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

Et 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, comme documenté en utilisant instructions préparées , cela vous protégera de l'injection de MySQL.

# Example:

Ci-dessous un exemple de coffre requête de base de données à l'aide d'instructions préparées (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();
 }

Et, en supposant maintenant que la connexion est établie, vous pouvez exécuter votre requête comme ceci.

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/désinfecter la valeur de $_POST["color"] . Et ce code est sécurisé de myql-injection grâce à PDO et à la puissance des instructions préparées.

Il est à noter que vous devez passer un charset=utf8 en attribut, dans votre DSN comme vu ci-dessus, pour des raisons de sécurité, et toujours activer PDO pour afficher les erreurs sous 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, le nom d'utilisateur de la base de données, etc.

Enfin et surtout, il y a des moments où vous ne devriez pas faire confiance à PDO à 100% et serez obligé de prendre des mesures supplémentaires pour empêcher l'injection sql, l'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 des instructions préparées comme indiqué ci-dessus sera toujours plus sûr que d'utiliser l'une des fonctions commençant par mysql_

Bonnes lectures

Tutoriel PDO pour les développeurs MySQL