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

Posted

技术标签:

【中文标题】带单引号的 Mysqli_real_escape_string - 安全吗? [复制]【英文标题】:Mysqli_real_escape_string with Single Quotes - Is it Safe? [duplicate] 【发布时间】:2016-11-10 10:20:57 【问题描述】:

所以我知道,由于查询格式不佳,使用带有占位符的准备好的语句几乎是保护自己免受 SQL 注入的唯一方法。但是,我也看到很多人建议,尽管 mysqli_real_escape_string 不安全,但在变量 is 周围使用单引号。例如(注意查询中的单引号):

$value1 = mysqli_real_escape_string($value1);
$value2 = mysqli_real_escape_string($value2);
$value3 = mysqli_real_escape_string($value3);

mysqli_query("INSERT INTO table (column1, column2, column3)
  VALUES ('" . $value1 . "', '" . $value2 . "', '" . $value3 . "')";

那么:只处理整数和字符串时,上面的例子是否和使用mysqli准备好的语句和占位符一样安全?

【问题讨论】:

不,无论您处理的是哪种数据类型,使用准备好的语句将永远像使用它们一样安全。跨度> @Don'tPanic - 我同意你的逻辑。有什么证据可以指点我吗? ***.com/questions/8263371/… 基本上,绑定到准备好的语句的参数本质上将被解释为数据。实际上没有办法强制它们被解释为命令。 这确实解释了为什么准备好的语句是安全的。但我的问题是mysql_real_escape_string 的这种特定用法是否也安全,因为它可以正确格式化任何可能的字符串或整数。 【参考方案1】:

不安全的不是mysqli_real_escape_string,而是 php 用户倾向于使用它的方式。

只要您使用set_charset() 设置字符集并且始终将转义值括在单引号中,不管类型如何,那么技术上上面的语句将安全。

但是,正如您所见,要遵循的规则太多了——对于普通 PHP 用户来说,这个条件太复杂了。因此,这种手动格式化无穷无尽的注入源,因为任何规则(转义、引用、设置字符集)都可能被忘记应用。

此外,手动转义只会使您的代码臃肿。为什么不让程序为您正确处理数据?

这就是为什么您必须有一种机制来自动应用所有规则。所以prepared statements就是这样一种机制。

像这样一个简单的函数有什么问题,任何你想要你的代码的理由:

$sql = "INSERT INTO table (column1, column2, column3) VALUES (?,?,?)";
some_query($sql, [$value1,$value2,$value3]);

【讨论】:

以上是关于带单引号的 Mysqli_real_escape_string - 安全吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

带单引号和双引号的 JSON.parse 字符串?

如何将带单引号的字符串转换为双引号以进行 json 解析

带单引号的 ADF 数据流连接表达式

sql语句中,传入的参数带单引号的问题

Dynamics 365 解决下载文件后文件名带单引号问题

调用js函数时,参数带单双引号怎么解决?