单引号的Mysqli_real_escape_string - 安全吗?

时间:2016-07-07 23:07:04

标签: php mysqli prepared-statement mysql-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预处理语句和占位符一样安全?

1 个答案:

答案 0 :(得分:3)

不是Put in number 1 Put in number 2 Put in number 3 Put in number 4 Put in number 5 found 不安全,而是PHP用户倾向于使用它的方式。

只要您设置的字符集mysqli_real_escape_string 总是将转义值包装在单引号中,尽管类型如此,那么技术上语句以上将是安全的。

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

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

这就是为什么你必须有一种机制来自动应用所有规则。如此准备好的陈述就是这样一种机制。

像这样的简单函数有什么问题,你想要更喜欢你的代码的原因是什么:

set_charset()