Mysqli_real_escape_string 函数中单引号是安全的吗?

14 浏览
0 Comments

Mysqli_real_escape_string 函数中单引号是安全的吗?

这个问题已经有了答案

绕过mysql_real_escape_string()的SQL注入

我知道使用带有占位符的预处理语句几乎是防止SQL注入的唯一方法,由于查询的格式不好。 但是,我也看到许多人建议,虽然mysqli_real_escape_string是不安全的,但使用单引号将变量括起来是安全的。 例如(请注意查询中的单引号):

$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准备的语句和占位符一样安全?

admin 更改状态以发布 2023年5月21日
0
0 Comments

并非mysqli_real_escape_string本身不安全,而是PHP用户使用它的方式不安全。

只要您使用set_charset()设置字符集,并且始终将转义后的值用单引号括起来,无论类型如何,那么从技术上讲,上述语句是安全的。

然而,正如您所看到的,有太多的规则需要遵循 - 这对于平均PHP用户来说是一个过于复杂的条件。因此,这种手动格式化是注入的一个无尽的来源,仅仅因为任何规则(转义,引用,设置字符集)都可能被忘记应用。

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

这就是为什么您必须有一种机制来自动应用所有规则。因此,预处理语句就是这样一种机制。

像这样一个简单的函数有什么问题,您有任何理由更喜欢它而不是您自己的代码吗:

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

0