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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top