我是否需要为我从数据库中获取的数据使用预准备语句?

时间:2016-06-08 14:52:08

标签: php mysql pdo prepared-statement

我有这样的查询:

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

我想使用$result['value']作为另一个查询UPDATE语句)的参数。我应该为UPDATE声明使用准备好的声明吗?或者因为我从数据库中获取它,那么不需要将它作为预处理语句传递?

1 个答案:

答案 0 :(得分:0)

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

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

您可能知道value中的mytable列是INTEGER类型的域知识,因此它是安全的。但是在更一般的情况下,以及不了解mytable的定义以及value可能包含的内容的读者。您的代码的读者会认为value不是“安全的”。就我们所知,我们可以得到这样的东西:

Robert'); DROP TABLE students; --

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

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