You*_*nse 13 php mysql sql-injection escaping prepared-statement
有些人认为mysql_real_escape_string()有一些缺陷,即使正确使用也无法保护您的查询.
将一些化石制品作为证据.
所以,问题是:mysql [i] _real escape_string()是完全不可接受的吗?
或者是否仍然可以使用此函数来创建自己的预备语句?
请提供验证码.
Gum*_*mbo 25
从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而是使用PHPmysql_set_charset来更改编码,因为它与MySQL相对应mysql_set_character_set(请参阅/ext/mysql/php_mysql.c的源代码).
但是,即使使用遗留代码和旧服务器版本,只有在数据库连接的字符集从Latin-1之类的单字节集更改为允许值0x5c的多字节数据集时才会触发此漏洞(ASCII单引号)在多字节字符的第二个或后一个字节中.
具体来说,UTF-8不允许这样做,不像GBK和SJIS这样的老式亚洲编码.因此,如果您的应用程序不更改连接字符集,或仅将其更改为UTF-8或单字节类型(如Latin-n),那么您可以免受此漏洞攻击.
但最佳实践仍然是运行最新的服务器版本,使用正确的界面来更改字符集,并使用准备好的查询,这样您就不会忘记逃避.