Mysqli_real_escape_string 带单引号 - 安全吗?
Mysqli_real_escape_string with Single Quotes - Is it Safe?
所以我知道使用带有占位符的准备好的语句几乎是保护自己免受 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 预准备语句和占位符一样安全?
不安全的不是mysqli_real_escape_string
,而是PHP用户倾向于使用它的方式。
只要您使用 set_charset()
和 设置字符集,无论类型如何,总是将转义值用单引号引起来,然后 从技术上讲 上面的陈述是安全的。
但是,如您所见,要遵循的规则太多了 - 对于普通 PHP 用户来说,这种情况太复杂了。因此,这种手动格式化 是 无穷无尽的注入源,仅仅是因为任何规则(转义、引用、设置字符集)都可能被忘记应用。
此外,手动转义只会让你的代码臃肿。为什么不让程序为您正确处理您的数据?
这就是为什么您必须有一种机制来自动应用所有规则。所以prepared statements就是这样一种机制。
像这样一个简单的函数有什么问题,任何你想要自己的代码而不是它的原因:
$sql = "INSERT INTO table (column1, column2, column3) VALUES (?,?,?)";
some_query($sql, [$value1,$value2,$value3]);
所以我知道使用带有占位符的准备好的语句几乎是保护自己免受 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 预准备语句和占位符一样安全?
不安全的不是mysqli_real_escape_string
,而是PHP用户倾向于使用它的方式。
只要您使用 set_charset()
和 设置字符集,无论类型如何,总是将转义值用单引号引起来,然后 从技术上讲 上面的陈述是安全的。
但是,如您所见,要遵循的规则太多了 - 对于普通 PHP 用户来说,这种情况太复杂了。因此,这种手动格式化 是 无穷无尽的注入源,仅仅是因为任何规则(转义、引用、设置字符集)都可能被忘记应用。
此外,手动转义只会让你的代码臃肿。为什么不让程序为您正确处理您的数据?
这就是为什么您必须有一种机制来自动应用所有规则。所以prepared statements就是这样一种机制。
像这样一个简单的函数有什么问题,任何你想要自己的代码而不是它的原因:
$sql = "INSERT INTO table (column1, column2, column3) VALUES (?,?,?)";
some_query($sql, [$value1,$value2,$value3]);