Почему mysql_real_escape_string () не работает правильно? - PullRequest
0 голосов
/ 01 мая 2011

в документации mysql_real_escape_string () сказано:

..., принимая во внимание текущий набор символов соединения, чтобы его можно было безопасно разместить вmysql_query ()

теперь, почему это не сработало корректно в этом примере ?

$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

мы изменили набор символов на mysql_query("SET CHARACTER SET 'gbk'", $c) раньшевызов mysql_real_escape_string, так почему эта функция не знает новый набор символов?

Ответы [ 2 ]

0 голосов
/ 01 мая 2011

SET CHARACTER SET / SET NAMES недостаточно для защиты от эксплойта GBK, в зависимости от используемой версии MySQL.

Если можете, используйте mysql_set_charset / mysqli_set_charset или реально подготовленные заявления.

Вы также захотите использовать MySQl 5.0.77 или выше. См. Этот мой предыдущий пост для получения дополнительной информации . Если вы используете более старые версии MySQL, вы можете быть уязвимыми без функций _set_charset.

Использование подготовленных операторов полностью обходит эту проблему.

0 голосов
/ 01 мая 2011

Вы читаете не ту документацию.

Вы говорите о mysql_real_escape_string , но вы ссылаетесь на документацию mysqli_real_escape_string . Обратите внимание на дополнительные i .

Документация для mysqli_real_escape_string гласит:

mysqli :: real_escape_string - mysqli_real_escape_string - побег специальные символы в строке для использования в операторе SQL, принимая во учитывать текущий набор символов подключение

Принимая во внимание, что документация для mysql_real_escape_string (которая используется в примере):

mysql_real_escape_string - Escape специальные символы в строке для использования в операторе SQL

...