Pourquoi ne fonctionne pas mysql_real_escape_string () correctement?
-
27-10-2019 - |
Question
dans la documentation de mysql_real_escape_string () il dit :
..., compte tenu du courant jeu de caractères de la connexion si qu'il est sûr de le placer dans un mysql_query ()
maintenant pourquoi ne pas correctement dans cet exemple ?
$c = mysql_connect("localhost", "user", "pass");
mysql_select_db("database", $c);
// change our character set
mysql_query("SET CHARACTER SET 'gbk'", $c);
// create demo table
mysql_query("CREATE TABLE users (
username VARCHAR(32) PRIMARY KEY,
password VARCHAR(32)
) CHARACTER SET 'GBK'", $c);
mysql_query("INSERT INTO users VALUES('foo','bar'), ('baz','test')", $c);
// now the exploit code
$_POST['username'] = chr(0xbf) . chr(0x27) . ' OR username = username /*';
$_POST['password'] = 'anything';
// Proper escaping, we should be safe, right?
$user = mysql_real_escape_string($_POST['username'], $c);
$passwd = mysql_real_escape_string($_POST['password'], $c);
$sql = "SELECT * FROM users WHERE username = '{$user}' AND password = '{$passwd}'";
$res = mysql_query($sql, $c);
echo mysql_num_rows($res); // will print 2, indicating that we were able to fetch all records
nous avons changé jeu de caractères par mysql_query("SET CHARACTER SET 'gbk'", $c)
avant d'appeler mysql_real_escape_string
, alors pourquoi ne pas cette fonction sait nouveau jeu de caractères?
La solution
SET CHARACTER SET
/ SET NAMES
ne suffit pas pour protéger contre le GBK exploitons, selon la version de MySQL que vous utilisez.
Si vous pouvez, utilisez mysql_set_charset
/ mysqli_set_charset
ou réelles déclarations préparées.
Vous allez également utiliser 5.0.77 MySQl ou mieux. Voir cette plus tôt après la mine pour plus d'informations . Si vous utilisez les anciennes versions de MySQL, vous peut être vulnérables sans les fonctions _set_charset
.
Utilisation d'instructions préparées entièrement court-circuite ce problème.
Autres conseils
Vous lisez la documentation erronée.
Vous parlez mysql_real_escape_string , mais vous font référence à la documentation de mysqli_real_escape_string . Notez le plus i .
La documentation mysqli_real_escape_string dit:
mysqli :: real_escape_string - mysqli_real_escape_string - Escapes caractères spéciaux dans une chaîne pour dans une instruction SQL, en prenant en compte le jeu de caractères courant connexion
considérant que, pour la documentation mysql_real_escape_string (qui est utilisé dans l'exemple):
mysql_real_escape_string - Escapes caractères spéciaux dans une chaîne pour dans une instruction SQL