在字符串()的文档中,它说:
.考虑到连接的当前字符集,以便将其放置在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更改了字符集,为什么这个函数不知道新的字符集呢?
发布于 2011-05-01 06:55:58
SET CHARACTER SET / SET NAMES是,没有足够的来防止GBK攻击,这取决于您使用的MySQL版本。
如果可以,可以使用mysql_set_charset / mysqli_set_charset或实际准备的语句。
您还需要使用MySQl 5.0.77或更高版本。有关更多信息,请参阅我前面的帖子。。如果使用的是较早版本的MySQL,则不使用_set_charset函数就可能容易受到攻击。
使用准备好的语句可以完全绕过这个问题。
https://stackoverflow.com/questions/5846840
复制相似问题