Mysql_real_escape_string() et mysql_escape_string() sont-ils suffisants pour la sécurité des applications ?
Bien que ces fonctions puissent fournir une certaine protection contre l'injection SQL et d'autres attaques , ils ne parviennent pas à résoudre certaines vulnérabilités.
Injection SQL
Mysql_real_escape_string() peut toujours exposer votre application à une injection SQL si vous ne gérez pas correctement les variables PHP dans les requêtes. Prenons l'exemple suivant :
$sql = "SELECT number FROM PhoneNumbers WHERE " . mysql_real_escape_string($field) . " = " . mysql_real_escape_string($value);
Cette requête peut être manipulée par un attaquant pour exécuter des instructions SQL non autorisées, car mysql_real_escape_string() n'est pas conçu pour sécuriser les noms de tables, les noms de colonnes ou les champs LIMIT.
Attaques Like
Mysql_real_escape_string() est insuffisant pour empêcher les exploits LIKE. Un attaquant pourrait saisir une valeur malveillante telle que « %% » pour renvoyer tous les enregistrements, compromettant potentiellement les informations sensibles.
Exploits de jeu de caractères
Certains navigateurs peuvent être vulnérables au jeu de caractères exploits, permettant aux attaquants d'injecter des caractères malveillants qui contournent les mécanismes d'échappement et d'exécuter des commandes SQL arbitraires.
Déclarations préparées : une solution complète
Pour sécuriser efficacement votre application, il est recommandé d'utiliser des instructions préparées au lieu de mysql_real_escape_string(). Les instructions préparées exécutent des requêtes SQL avec des valeurs fournies par l'utilisateur en les liant en tant que paramètres. Cela élimine le besoin d'échappement manuel et garantit que seul le SQL autorisé est exécuté.
Voici un exemple d'utilisation d'une instruction préparée en PHP :
$pdo = new PDO($dsn); $column = 'url'; $value = 'http://www.example.com/'; $limit = 1; // Validate the search parameter column. $validColumns = array('url', 'last_fetched'); 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())) { }
Les instructions préparées offrent un mécanisme de défense proactif en en tirant parti des fonctionnalités de sécurité du serveur de base de données sous-jacent. Ils sont intrinsèquement résistants aux attaques connues et inconnues, garantissant ainsi l'intégrité de vos 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!