Mysqli_real_escape_string 函数中单引号是安全的吗?
Mysqli_real_escape_string 函数中单引号是安全的吗?
这个问题已经有了答案:
我知道使用带有占位符的预处理语句几乎是防止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日
并非mysqli_real_escape_string
本身不安全,而是PHP用户使用它的方式不安全。
只要您使用set_charset()
设置字符集,并且始终将转义后的值用单引号括起来,无论类型如何,那么从技术上讲,上述语句是安全的。
然而,正如您所看到的,有太多的规则需要遵循 - 这对于平均PHP用户来说是一个过于复杂的条件。因此,这种手动格式化是注入的一个无尽的来源,仅仅因为任何规则(转义,引用,设置字符集)都可能被忘记应用。
此外,手动转义只会使您的代码膨胀。为什么不让程序为您正确处理数据呢?
这就是为什么您必须有一种机制来自动应用所有规则。因此,预处理语句就是这样一种机制。
像这样一个简单的函数有什么问题,您有任何理由更喜欢它而不是您自己的代码吗:
$sql = "INSERT INTO table (column1, column2, column3) VALUES (?,?,?)"; some_query($sql, [$value1,$value2,$value3]);