PHP SQLite3中的预处理语句与转义字符串


Prepared statements vs. escaping strings in PHP SQLite3

我在PHP中使用SQLite3。

一个朋友告诉我,我应该更喜欢准备好的语句,我也在StackOverflow上的许多帖子中读到过。我想了解使用预处理语句的好处,因为我必须编写比常规转义(如:

)更多的行。
$db->exec("Insert INTO table VALUES(NULL,'".$db->escapeString($value)."')"

或使用:

foreach($_POST as $k => $v) {
    $_POST[$k] = $db->escapeString($v);
}

为什么要使用预处理语句?优点和缺点是什么?

人们经常混淆参数和原生预处理语句。我怀疑Sqlite是否支持后者,但无论如何,您必须总是使用参数来替代查询中的实际数据。

当参数(也称为"占位符")被处理时,重要的事情发生了:

  • 应用所有所需的格式化(即转义引号)(而转义只会完成一半的工作-使您的查询大范围开放给注入)。
  • 这样的格式被应用到要查询的数据,而不是源变量,破坏它(所以,你可以通过电子邮件发送它或存储在会话中)。
  • 这样的格式被自动应用,使您的安全独立于开发人员的善意。这是非常重要的事情

Prepared Statement主要用于避免黑客和任何恶意程序的SQL injection