mysql_real_escape_string()坏了吗?

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的源代码).

  • 好的,那么如果我们使用没有本机字符集设置方法的mysqli或PDO会发生什么呢?准备好的报表安全吗? (2认同)
  • 谢谢!PDO似乎是唯一缺乏的.它有[DSN中的`charset` param](http://www.php.net/manual/en/ref.pdo-mysql.connection.php),但它被标记为"当前被忽略......" (2认同)

LHM*_*ies 8

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

具体来说,UTF-8不允许这样做,不像GBK和SJIS这样的老式亚洲编码.因此,如果您的应用程序不更改连接字符集,或仅将其更改为UTF-8或单字节类型(如Latin-n),那么您可以免受此漏洞攻击.

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