首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么mysql_real_escape_string()不能正常工作?

为什么mysql_real_escape_string()不能正常工作?
EN

Stack Overflow用户
提问于 2011-05-01 06:17:16
回答 2查看 926关注 0票数 0

字符串()的文档中,它说:

.考虑到连接的当前字符集,以便将其放置在mysql_query()中是安全的

为什么它在这个例子中不能正常工作?

代码语言:javascript
复制
$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更改了字符集,为什么这个函数不知道新的字符集呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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函数就可能容易受到攻击。

使用准备好的语句可以完全绕过这个问题。

票数 0
EN

Stack Overflow用户

发布于 2011-05-01 06:44:48

你看错文件了。

您所谈论的是字符串,但您指的是字符串文档。注意附加的i。

mysqli_real_escape_string的文档说:

mysqli::real_escape_string -- mysqli_real_escape_string --考虑到连接的当前字符集,在字符串中查找特殊字符以供在SQL语句中使用。

然而,mysql_real_escape_string的文档(在示例中使用):

mysql_real_escape_string -用于在SQL语句中使用的字符串中的特殊字符

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5846840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档