mysql_real_escape_string()坏了吗?

时间:2011-03-13 11:03:48

标签: php mysql escaping sql-injection prepared-statement

有些人认为mysql_real_escape_string()有一些缺陷,即使正确使用也无法保护您的查询 将一些fossilized articles作为证据。

所以,问题是:mysql [i] _real escape_string()是完全不可接受的吗? 或者是否仍然可以使用此函数来创建自己的预备语句?

请使用校验码。

3 个答案:

答案 0 :(得分:24)

来自MySQL’s C API function mysql_real_escape_string description

  

如果需要更改连接的字符集,则应使用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’s mysql_set_charset来更改编码,因为它与MySQL的mysql_set_character_set相对应(请参阅source code of /ext/mysql/php_mysql.c)。

答案 1 :(得分:7)

但是,即使使用遗留代码和旧服务器版本,只有在数据库连接的字符集从像Latin-1这样的单字节字符集更改为允许值0x5c的多字节字符集时,才能触发此漏洞( ASCII单引号)在多字节字符的第二个或后一个字节中。

具体而言,与GBK和SJIS等较老的亚洲编码不同,UTF-8不允许这样做。因此,如果您的应用程序不更改连接字符集,或仅将其更改为UTF-8或单字节类型(如Latin-n),则可以免受此漏洞攻击。

但最佳实践仍然是运行最新的服务器版本,使用正确的界面来更改字符集,并使用准备好的查询,这样您就不会忘记逃避。

答案 2 :(得分:3)

在评论中有一个指向mySQL 5.0.22 (24 May 2006)中的错误修正的链接,其中已经解决了这个问题。