mysqli_real_escape_string如何无法防止SQL注入攻击?

10
首先,我理解人们想使用存储过程是为了重用查询并处理转义。但是,我读到很多开发人员说 mysqli_real_escape_string 不能百分之百地防止 SQL 注入攻击。有人能否举个例子呢?
就我有限的知识而言,mysqli_real_escape_string 对于字符串始终可以正常工作,但对于数值类型,除非您检查数字是否为 int、float、double 等,否则可能会被捕获。
编辑:我忘记添加一些关键信息:假设字符集为 UTF8,并已相应地调用 mysqli_set_charset。我看到的唯一注入依赖于一些字符集(其中没有 UTF8)。

6
SQL注入攻击可以绕过mysql_real_escape_string()函数的防护。 - John Woo
链接中的答案对我来说太花哨了。 - Your Common Sense
1个回答

7
只要使用 mysqli_set_charset() 来设置客户端编码,并且只针对字符串使用 mysqli_real_escape_string() 格式化,那么就是非常安全的。
但是,如果您的问题意味着在应用程序代码中直接使用此函数,而不是基于占位符的查询进行后台处理,或者至少以 PDO 的 quote() 类似功能的形式(一次性执行转义引号),则这将是注入攻击的直接途径。
问题并不在于函数本身,而在于其使用方式:
  • 因为它只执行所需格式化的部分,一个人很容易忘记另一部分而失误。
  • 或者甚至可以轻松地误用它来格式化另一个文字字面量,这根本不需要任何转义。
  • 其次,当它直接在应用程序代码中使用时,其使用变得不一致或偶然,因为没有办法强制开发人员正确格式化每个文字字面量。这可能会导致不准确性和注入攻击。
这就是为什么您必须始终使用占位符来表示查询中的数据(而 mysqli_real_escape_string 可以用于处理这个占位符)。

关于使用双引号字面量的 NO_BACKSLASH_ESCAPES 模式,需要注意 [必需](https://dev59.com/Ym025IYBdhLWcg3w4qEx#23277864)的附加条件。 - eggyal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接