mysql_real_escape_string()是否被破坏?

有些人认为mysql_real_escape_string()有一些缺陷,即使正确使用,也不能保护你的查询。
带来一些化石的文章作为certificate。

所以,问题是:mysql [i] _real escape_string()完全不可接受?
还是可以使用这个函数来创build自己的准备好的语句?

请用校对码。

从MySQL的C API函数mysql_real_escape_string描述 :

如果您需要更改连接的字符集,则应使用mysql_set_character_set()函数而不是执行SET NAMES (或SET CHARACTER SET )语句。 mysql_set_character_set()工作方式与SET NAMES类似,但也会影响mysql_real_escape_string()所使用的字符集,而SET NAMES则不会。

因此,不要使用SET NAMES / SET CHARACTER SET而是使用PHP的mysql_set_charset来更改编码,因为这是MySQL的mysql_set_character_set的对应部分(请参阅/ext/mysql/php_mysql.c的源代码 )。

但是,即使使用旧代码和旧服务器版本,也只有在数据库连接的字符集从Latin-1单字节更改为允许值0x5c(ASCII单引号)的多字节连接)在多字节字符的第二个或更晚的字节中。

特别是,UTF-8不允许使用像GBK和SJIS这样的老的亚洲编码。 因此,如果您的应用程序不改变连接字符集,或者只将其更改为UTF-8或单字节(如Latin-n),则可以安全地使用此漏洞。

但最佳实践仍然是运行最新的服务器版本,使用正确的界面来改变字符集,并使用准备好的查询,所以你不要忘记逃离东西。

在评论中有一个链接到一个错误修正在MySQL 5.0.22(2006年5月24日) ,这已被解决。