Sécurité MySQL : mysql_real_escape_string() et mysql_escape_string() sont-elles adéquates ?
L'efficacité de mysql_real_escape_string() et mysql_escape_string() pour la sécurité des applications a suscité un certain débat. Bien que ces fonctions empêchent les vecteurs d'injection SQL connus, leurs limitations peuvent vous rendre vulnérable à des attaques plus avancées.
Susceptibilité aux injections SQL
Malgré l'utilisation de mysql_real_escape_string(), vous pouvez être toujours sensible aux injections SQL dans les scénarios où les variables PHP sont intégrées dans les requêtes. Par exemple, considérons ce code :
<code class="php">$sql = "SELECT number FROM PhoneNumbers " . "WHERE " . mysql_real_escape_string($field) . " = " . mysql_real_escape_string($value);</code>
Un pirate informatique sophistiqué pourrait exploiter cette requête avec l'entrée suivante :
<code class="php">$field = "1=1" $value = "1"</code>
Cela contourne la logique prévue, renvoyant (potentiellement) tous les enregistrements à la place. de ceux correspondant aux critères spécifiés.
Attaques LIKE
mysql_real_escape_string() est inefficace pour empêcher les attaques LIKE, telles que :
<code class="php">$sql = "SELECT number FROM PhoneNumbers " . "WHERE " . mysql_real_escape_string($field) . " LIKE " . mysql_real_escape_string($value);</code>
A Un utilisateur malveillant pourrait définir $value sur % pour récupérer tous les enregistrements, exposant potentiellement des données sensibles.
Exploits de jeu de caractères
Internet Explorer reste vulnérable aux exploits de jeu de caractères, même en 2011. Cette vulnérabilité peut accorder aux attaquants le contrôle de votre base de données, similaire aux injections SQL.
Déclarations préparées : une approche proactive
mysql_real_escape_string() et mysql_escape_string() sont vulnérables car ce sont des mécanismes de défense réactifs. Les déclarations préparées, en revanche, fournissent une solution proactive. En exécutant uniquement du SQL valide et programmé, les instructions préparées réduisent considérablement le risque d'exécution SQL inattendue, quelles que soient les vulnérabilités de la base de données sous-jacente.
Voici un exemple utilisant des instructions préparées :
<code class="php">$statement = $pdo->prepare('SELECT url FROM GrabbedURLs ' . 'WHERE ' . $column . '=? ' . 'LIMIT ' . intval($limit)); $statement->execute(array($value));</code>
Les instructions préparées sont à la fois sécurisées et moins verbeuses que l'utilisation de mysql_real_escape_string(). Ils s'appuient sur les mesures de protection du serveur de base de données pour se prémunir contre les menaces connues et inconnues.
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!