MySql_real_escape_string() et mysql_escape_string() sont-ils suffisants pour la sécurité des applications ? Évaluation des vulnérabilités potentielles
Malgré leur utilisation courante, mysql_real_escape_string() et mysql_escape_string() peuvent ne pas protéger complètement les bases de données contre les attaques SQL, les laissant vulnérables à divers exploits malveillants.
Attaques par injection SQL
Contrairement à la croyance populaire, mysql_real_escape_string() ne peut pas empêcher les injections SQL dans tous les scénarios. Il échappe efficacement aux données variables mais ne parvient pas à protéger les noms de tables, les noms de colonnes ou les champs LIMIT contre les manipulations malveillantes. Cette limitation peut être exploitée par des attaquants pour créer des requêtes comme celles-ci :
$sql = "SELECT number FROM PhoneNumbers WHERE " . mysql_real_escape_string($field) . " = " . mysql_real_escape_string($value);
Un pirate informatique expérimenté pourrait toujours contourner ces fonctions d'échappement en manipulant le champ ou les variables de valeur pour créer une requête malveillante.
Attaques LIKE SQL
Les attaques LIKE SQL peuvent également contourner les protections mysql_real_escape_string(). Dans le cadre de requêtes impliquant des instructions LIKE "$data%", un attaquant pourrait fournir une chaîne vide comme entrée pour faire correspondre tous les enregistrements, exposant potentiellement des informations sensibles telles que les numéros de carte de crédit.
Exploits de jeu de caractères
Les exploits Charset restent une menace, en particulier dans Internet Explorer. En exploitant les différences de jeux de caractères entre la base de données et le navigateur Web, les attaquants peuvent exécuter des requêtes malveillantes qui prennent le contrôle total du serveur SQL.
LIMIT Exploits
LIMIT exploits permettent attaquants pour manipuler la clause LIMIT d'une requête SQL, en l'utilisant pour joindre plusieurs requêtes et exécuter des commandes non autorisées.
Préparé Les déclarations comme défense robuste
Pour lutter contre ces vulnérabilités et garantir une sécurité efficace des applications, les déclarations préparées apparaissent comme le mécanisme de défense préféré. Les instructions préparées utilisent la validation côté serveur pour exécuter uniquement les instructions SQL autorisées, fournissant ainsi une défense proactive contre les exploits connus et inconnus.
Exemple de code utilisant des instructions préparées
$pdo = new PDO($dsn); $column = 'url'; $value = 'http://www.stackoverflow.com/'; $limit = 1; $validColumns = array('url', 'last_fetched'); // Validate the $column parameter if (!in_array($column, $validColumns)) { $column = 'id'; } $statement = $pdo->prepare('SELECT url FROM GrabbedURLs ' . 'WHERE ' . $column . '=? ' . 'LIMIT ' . intval($limit)); $statement->execute(array($value)); while (($data = $statement->fetch())) { }
Conclusion
Alors que mysql_real_escape_string() et mysql_escape_string() fournissent une certaine protection contre les attaques SQL, ils ne sont pas infaillibles. La mise en œuvre d'instructions préparées est une solution plus complète et plus robuste qui protège les applications contre un large éventail de vulnérabilités, garantissant ainsi une meilleure sécurité des applications.
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!