有些人认为mysql_real_escape_string()
有一些缺陷,即使正确使用也无法保护您的查询
将一些fossilized articles作为证据。
所以,问题是:mysql [i] _real escape_string()是完全不可接受的吗? 或者是否仍然可以使用此函数来创建自己的预备语句?
请使用校验码。
答案 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)中的错误修正的链接,其中已经解决了这个问题。