mysqli_real_escape_string 如何无法阻止 SQL 注入? [复制]

Posted

技术标签:

【中文标题】mysqli_real_escape_string 如何无法阻止 SQL 注入? [复制]【英文标题】:How can mysqli_real_escape_string fail to prevent a SQL injection? [duplicate] 【发布时间】:2013-04-25 06:53:05 【问题描述】:

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

根据我对该主题的有限知识,我会说mysqli_real_escape_string总是适用于字符串,但对于数值,除非您检查数字是 int、float、双倍等。

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

【问题讨论】:

SQL injection that gets around mysql_real_escape_string() 链接的答案对我来说太浮华了。 【参考方案1】:

只要你使用mysqli_set_charset()设置客户端编码,mysqli_real_escape_string()用于格式化字符串,绝对安全。

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

问题不在于功能本身,而在于使用方式:

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

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

【讨论】:

附加警告 required re NO_BACKSLASH_ESCAPES 双引号文字模式。

以上是关于mysqli_real_escape_string 如何无法阻止 SQL 注入? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

“mysqli_real_escape_string”是不是足以避免 SQL 注入或其他 SQL 攻击?

mysqli_real_escape_string 如何无法阻止 SQL 注入? [复制]

mysqli_real_escape_string 如何无法阻止 SQL 注入? [复制]

filter_var 或 mysqli_real_escape_string [重复]

带单引号的 Mysqli_real_escape_string - 安全吗? [复制]

带单引号的 Mysqli_real_escape_string - 安全吗? [复制]