【问题标题】:Do I need to use prepared statement for the data I'm getting from database?我是否需要对从数据库获取的数据使用准备好的语句?
【发布时间】:2016-06-08 14:52:08
【问题描述】:

我有一个这样的查询:

$result = $db
-> prepare("SELECT value FROM mytable WHERE id = ?")
-> execute(array($id))
-> fetch(PDO::FETCH_ASSOC);

我想使用$result['value'] 作为另一个查询的参数(UPDATE 语句)。我应该为UPDATE 语句使用准备好的语句吗?还是因为我是从数据库中获取的,所以不需要将其作为准备好的语句传递?

【问题讨论】:

  • 是的,你总是应该的。它被称为second level injection。永远不要假设任何数据都是安全的。永远。
  • @Andrew 但我很确定我从数据库中得到的东西是安全的.. 为什么不应该呢?
  • “相当肯定”是原因之一。 ;)
  • @Stack Guilty 直到被证明是无辜的。
  • 数据可以是安全的,但是有效数据中的引号仍然会破坏你的sql语句。也许不是在这种特定情况下,您可能正在谈论一个整数,但一般来说,如果您不准备它(或转义数据......),字符串仍然可以包含字符甚至是破坏或修改您的 sql 语句的 sql。

标签: php mysql pdo prepared-statement


【解决方案1】:

是的。使用带有绑定占位符的准备好的语句。

仅仅因为从数据库返回值并不意味着该值可以安全地包含在 SQL 文本中。

您可能知道mytable 中的value 列是INTEGER 类型,因此它是安全的。但在更一般的情况下,对于不知道mytable 的定义以及value 可能包含什么的读者。您的代码的读者会假设 value 不是“安全的”。据我们所知,我们可能会得到这样的结果:

Robert'); DROP TABLE students; --

每当我们看到连接到 SQL 文本中的变量时,我们将假定变量可能包含值以外的内容,并且它可能包含实际的 SQL。 (或者,如果我们确实看到一个变量连接到 SQL 语句的文本中,我们会期望它会在连接时被正确转义。)

因此,首选模式是使用带有绑定占位符的准备好的语句。这使得读者可以清楚地知道value 确实是一个值,并且不打算将其解释为 SQL 文本。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
  • 2015-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
相关资源
最近更新 更多