Quel est L'équivalent AOP de la fonction mysql real escape string?

je modifie mon code en remplaçant mysql_* par PDO . Dans mon code, j'avais mysql_real_escape_string() . Qu'en est-il de L'équivalent en AOP?

35
demandé sur Peter Mortensen 2012-12-23 20:32:03

5 réponses

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

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

c'est ça! si vous utilisez déjà PDO de la bonne manière comme documenté en utilisant déclarations préparées , alors il vous protégera de MySQL injection.


# Example:

ci-dessous un exemple de safe requête de base de données utilisant des déclarations préparées (AOP)

  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, en supposant 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 dire, je n'ai pas utilisé quoi que ce soit pour échapper/assainir la valeur de $_POST["color"] . Et ce code est sécurisé de myql-injection grâce à PDO et la puissance de déclarations préparées.


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

Last but not least, il ya des moments où vous ne devriez pas faire confiance à PDO 100%, et sera tenu de prendre des mesures supplémentaires pour empêcher l'injection sql, l'un de ces cas est, si vous utilisez une version périmée de mysql [ mysql =< 5.3.6 ] comme décrit dans cette réponse

mais, en utilisant des instructions préparées comme indiqué ci-dessus sera toujours plus sûr, que d'utiliser l'une des fonctions qui commencent par mysql_

Bonnes lectures

PDO Tutorial pour les développeurs MySQL

59
répondu samayo 2018-07-12 16:11:44

Il n'y a aucun*! L'objet de PDO est que vous n'avez pas à échapper à quoi que ce soit; vous l'envoyez simplement 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;");

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

25
répondu Ry- 2014-02-01 15:50:57
$v = '"'.mysql_real_escape_string($v).'"'; 

est l'équivalent de $v = $this->db->quote($v); assurez-vous que vous avez une instance D'AOP dans $this->db pour que vous puissiez appeler la méthode d'AOP quote()

3
répondu simohamed 2015-04-04 13:58:24

il n'est pas nécessaire de mysql_real_escape_string en AOP.

PDO lui-même ajuste le caractère spécial dans la requête mysql ,vous avez seulement besoin de passer le paramètre anonymous et de le lier le temps d'exécution.pareil Supposons que vous avez la table d'utilisateur avec le nom d'attribut, le courriel et le mot de passe et vous devez insérer dans cette utilisation préparer la déclaration comme ceci vous pouvez passer nom => $nom="Rajes h ";

il devrait exécuter il n'est pas nécessaire 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
répondu IMRA 2018-07-25 13:08:03

si pour répondre à la question initiale, il s'agit de l'équivalent AOP de mysql_real_escape_string :

function my_real_escape_string($value, $connection) {
    /* 
    // this fails on: value="hello'";
    return trim ($connection->quote($value), "'");
    */
    return substr($connection->quote($value), 1, -1);       
}

btw, l'équivalent mysqli est:

function my_real_escape_string($value, $connection) {
    return mysqli_real_escape_string($connection, $value);
}
-1
répondu IT goldman 2015-12-30 08:02:25