Mysql_real_escape_string() est-il suffisant pour la prévention des injections SQL ?
Bien que beaucoup pensent que l'utilisation de mysql_real_escape_string() protège contre l'injection SQL, il existe en effet une possibilité de contournement.
Le Défaut
Dans des cas spécifiques, tels que :
mysql_query('SET NAMES gbk'); $var = mysql_real_escape_string("\xbf\x27 OR 1=1 /*"); mysql_query("SELECT * FROM test WHERE name = '$var' LIMIT 1");
Le problème survient en raison d'une inadéquation entre le jeu de caractères attendu du serveur et la perception du client. En utilisant 'SET NAMES' pour modifier le jeu de caractères sur le serveur, mysql_real_escape_string() peut échapper ' comme en ASCII, alors que le serveur l'attend sous forme de texte brut. Cela crée un écart, permettant une suspension libre et des injections.
The Bad
L'émulation par défaut des instructions préparées par PDO peut également conduire à cette faille. La désactivation de l'émulation est recommandée, mais le recours à l'émulation pour les requêtes non prises en charge peut empêcher une protection complète.
The Ugly
Avant MySQL 4.1.20, un bug autorisait les caractères multi-octets non valides. comme ceux vus dans la charge utile, doivent être échappés sous forme d'octets uniques, même avec le jeu de caractères client correct informations.
The Saving Grace
L'utilisation de jeux de caractères imperméables comme utf8mb4 ou utf8, ou l'activation du mode SQL NO_BACKSLASH_ESCAPES, offre une protection contre cette vulnérabilité.
Conclusions
Emploi mysql_real_escape_string() reste efficace dans de nombreuses situations, mais il est crucial d'être conscient des cas extrêmes potentiels. L'utilisation de techniques sécurisées telles que les champs énumérés et les instructions préparées, ainsi que la configuration appropriée du jeu de caractères et du mode, sont essentielles pour une protection complète contre les injections SQL.
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!