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 ?
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
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]));
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!