Mysql
 sql >> Base de données >  >> RDS >> Mysql

Une attaque par injection qui réussit avec mysql_query, mais échoue avec mysqli_query

J'ai été amené à croire que :

$selection = mysql_query($dblink, "SELECT * FROM table WHERE name='$idValue' ");

peut être facilement compromis avec des valeurs pour $idValue qui ferment le ' puis ajoutez des commandes supplémentaires, telles que

$idValue = "z'; DELETE * FROM table WHERE name IS NOT NULL";

Bien que je réalise que vous déclarez que plusieurs instructions sont désactivées, quelque chose qui n'est pas aussi horrible serait de renvoyer des données non autorisées plutôt que de modifier directement les données dans la table, telles que :

  $idValue = "z' OR name IS NOT NULL OR name = 'x";

Alors qu'avec MySQLi il y a la possibilité que l'approche peut être utilisée avec des prepared statements , ce qui empêcherait la variable d'agir en dehors de son statut de simple variable. Tels que :

mysqli->prepare("SELECT * FROM tables WHERE name = ? LIMIT 1");
mysqli->bind_param("s",$idValue);
mysqli->execute();

Ma compréhension de bind_param est que la variable aurait tous les mots-clés MySQL et les caractères clés échappés, empêchant ainsi la faille de sécurité et le retour de lignes non autorisées.

C'est un choix que MySQL n'a pas . Les déclarations préparées aident à améliorer la sécurité des injections, mais ils n'empêcheront pas attaques par injection seules, mais davantage devraient être utilisées dans le cadre d'une stratégie plus large par le programmeur.

Tout comme le port d'un gilet pare-balles ne vous rendra pas invincible, mais cela améliorera grandement vos chances de survie. MySQLi n'est pas une solution miracle, pas plus que PDO, mais ils amélioreront globalement les niveaux de sécurité.

MySQL est également obsolète et, comme l'a déclaré Christopher, ne plus être maintenu signifie que le nombre de trous et de problèmes avec lui ne fera qu'augmenter à mesure que d'autres technologies continueront de se développer.

Résumé

Si vous écrivez MySQLi instructions de la même manière que vous avez écrit des instructions MySQL, vous n'aurez alors aucune protection supplémentaire contre les injections. Cependant, MySQLi propose les Déclarations préparées approche qui augmente considérablement la défense contre l'injection SQL, mais le changement d'interface de base de données sous-jacente en soi ne vous donne aucun avantage ou protection inhérent à moins que vous ne choisissiez de les coder vous-même à l'aide d'instructions préparées .