Maison >base de données >tutoriel mysql >`mysql_real_escape_string()` et `mysql_escape_string()` sont-ils suffisants pour empêcher les attaques par injection MySQL ?

`mysql_real_escape_string()` et `mysql_escape_string()` sont-ils suffisants pour empêcher les attaques par injection MySQL ?

DDD
DDDoriginal
2024-12-17 10:23:25738parcourir

Are `mysql_real_escape_string()` and `mysql_escape_string()` Enough to Prevent MySQL Injection Attacks?

Attaques par injection MySQL : une plongée plus approfondie

Introduction

Assurer la sécurité des applications Web est crucial, et la protection des bases de données est un élément essentiel de cet effort. Cet article examine l'efficacité de l'utilisation de mysql_real_escape_string() et mysql_escape_string() pour se protéger contre les attaques SQL.

Les fonctions d'échappement sont-elles suffisantes pour la sécurité ?

mysql_real_escape_string() et mysql_escape_string () sont couramment utilisés pour échapper des données avant de les insérer dans des requêtes SQL. Cependant, ces fonctions protègent-elles suffisamment contre tous les vecteurs d'attaque ?

Avis d'experts

Selon les experts, mysql_real_escape_string() n'offre pas une protection complète contre les injections SQL. En effet, il est uniquement destiné à échapper aux variables PHP dans les requêtes. Il ne peut pas gérer les noms de table ou de colonne qui s'échappent ou les champs LIMIT.

Vulnérabilité aux attaques connues

Considérez l'exemple suivant :

$sql = "SELECT number FROM PhoneNumbers " .
       "WHERE " . mysql_real_escape_string($field) . " = " . mysql_real_escape_string($value);

Cette requête est vulnérable à l'injection SQL si le champ $ ou la valeur $ contient une entrée malveillante. Un pirate informatique pourrait créer une requête malveillante qui contourne l'échappement et exécute des commandes non autorisées.

Vecteurs d'attaque spécifiques

  • Attaques LIKE : mysql_real_escape_string( ) est inefficace contre les attaques LIKE, telles que LIKE "$data%". Cela peut exposer tous les enregistrements d'une table, révélant potentiellement des informations sensibles.
  • Exploits de jeu de caractères :Ces exploits tirent parti des vulnérabilités d'Internet Explorer et de la gestion des jeux de caractères de PHP. Ils peuvent permettre aux pirates d'exécuter des requêtes SQL arbitraires.

Une démonstration

Le code suivant montre comment ces attaques peuvent être exploitées :

$sql = sprintf("SELECT url FROM GrabbedURLs WHERE %s LIKE '%s%%' LIMIT %s",
               mysql_real_escape_string($argv[1]),
               mysql_real_escape_string($argv[2]),
               mysql_real_escape_string($argv[3]));
  • Entrée 1 : Renvoie les URL commençant par "http://www.reddit.com"
  • Entrée 2 : Renvoie chaque résultat (un exploit)
  • Entrée 3 : Exécute de manière inattendue Requêtes SQL

La solution : préparée Déclarations

Les experts recommandent d'utiliser des instructions préparées au lieu d'échapper aux fonctions. Les instructions préparées sont des techniques côté serveur qui garantissent que seul du SQL valide est exécuté. Cette approche offre une protection complète contre les injections SQL, connues et inconnues.

Exemple d'utilisation de PDO

$sql = 'SELECT url FROM GrabbedURLs WHERE ' . $column . '=? LIMIT ?';
$statement = $pdo->prepare($sql);
$statement->execute(array($value, $limit));

Ce code utilise des instructions préparées pour échapper aux entrées de l'utilisateur et exécuter des requêtes. en toute sécurité.

Conclusion

Pendant mysql_real_escape_string() et mysql_escape_string() offrent une certaine protection contre les injections SQL, elles ne suffisent pas pour une sécurité complète. Les instructions préparées sont l'approche recommandée pour une sécurité robuste des bases de données.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn