9

首先,我知道人们想要使用存储过程,以便他们重用查询并处理转义。但是,我读过很多开发人员说mysqli_real_escape_string不能 100% 防止 SQL 注入。有人可以提供一个例子吗?

根据我对该主题的有限知识,我会说这mysqli_real_escape_string对于字符串总是很好,但对于数值,除非你检查数字是 int、float、double 等,否则你可能会被抓住。

编辑:我忘了添加一些关键的东西:假设字符集是 UTF8 并且 mysqli_set_charset 已被相应地调用。我见过的唯一注入依赖于少数字符集(都不是 UTF8)。

4

1 回答 1

7

只要您mysqli_set_charset()用于设置客户端编码,并且mysqli_real_escape_string()仅用于格式化字符串,它就非常安全。

但是,如果您的问题暗示在应用程序代码中使用此函数,而不是基于占位符的查询的幕后处理或至少以 PDO 的quote()类似函数的形式(它会立即转义引用)它是直接注射方式。

它不是功能本身的问题,而是它的使用方式:

  • 由于它只执行所需格式的一部分,因此很容易忘记另一部分并陷入麻烦
  • 甚至它也很容易被滥用,而不是格式化字符串,而是格式化另一个根本不会从转义中受益的文字。
  • 其次,当它在应用程序代码中正确使用时,它的用法会变得不一致或偶尔出现,因为没有办法强制开发人员正确地格式化每个文字并且不会失败。这又可能导致不准确和注入。

这就是为什么您必须始终使用占位符来表示查询中的数据(而 mysqli_real_escape_string 可以用来处理这个占位符好吧)

于 2013-05-01T09:01:53.020 回答