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日) ,这已被解决。