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

Lacunes de mysql_real_escape_string ?

Le principal défaut de mysql_real_escape_string , ou de l'extension mysql_ en général, est qu'elle est plus difficile à appliquer correctement que d'autres API plus modernes, en particulier les instructions préparées. mysql_real_escape_string est censé être utilisé dans exactement un cas :échapper le contenu textuel utilisé comme valeur dans une instruction SQL entre guillemets. Ex. :

$value = mysql_real_escape_string($value, $link);
$sql = "... `foo` = '$value' ...";
                     ^^^^^^

mysql_real_escape_string s'assure que la $value dans le contexte ci-dessus ne gâche pas la syntaxe SQL. Cela ne fonctionne pas comme vous pouvez le penser ici :

$sql = "... `foo` = $value ...";

ou ici :

$sql = "... `$value` ...";

ou ici :

$sql = mysql_real_escape_string("... `foo` = '$value' ...");

Si elle est appliquée à des valeurs qui sont utilisées dans un contexte autre qu'une chaîne entre guillemets dans une instruction SQL, elle est mal appliquée et peut ou non gâcher la syntaxe résultante et/ou permettre à quelqu'un de soumettre des valeurs qui peuvent permettre des attaques par injection SQL. Le cas d'utilisation de mysql_real_escape_string est très étroite, mais est rarement correctement comprise.

Une autre façon de vous mettre dans l'eau chaude en utilisant mysql_real_escape_string est lorsque vous définissez le codage de connexion à la base de données en utilisant la mauvaise méthode. Vous devriez faire ceci :

mysql_set_charset('utf8', $link);

Vous pouvez fais aussi ceci :

mysql_query("SET NAMES 'utf8'", $link);

Le problème est que ce dernier contourne l'API mysql_, qui pense toujours que vous parlez à la base de données en utilisant latin1 (ou autre chose). Lors de l'utilisation de mysql_real_escape_string maintenant, il assumera le mauvais codage de caractères et les chaînes d'échappement différemment que la base de données les interprétera plus tard. En exécutant le SET NAMES requête, vous avez créé un fossé entre la façon dont l'API client mysql_ traite les chaînes et la façon dont la base de données interprétera ces chaînes. Cela peut être utilisé pour les attaques par injection dans certaines situations de chaînes multioctets.

Il n'y a pas de vulnérabilités d'injection fondamentales dans mysql_real_escape_string dont je suis conscient si elle est appliquée correctement. Encore une fois, le principal problème est qu'il est terriblement facile de l'appliquer de manière incorrecte, ce qui ouvre des vulnérabilités.