我是否需要对从数据库中获取的数据使用准备好的语句?
Do I need to use prepared statement for the data I'm getting from database?
我有这样的查询:
$result = $db
-> prepare("SELECT value FROM mytable WHERE id = ?")
-> execute(array($id))
-> fetch(PDO::FETCH_ASSOC);
我想使用 $result['value']
作为另一个查询 (一个 UPDATE
语句) 的参数。我应该为该 UPDATE
语句使用准备好的语句吗?或者因为我已经从数据库中获取了它,所以不需要将它作为准备好的语句传递?
是的。使用带有绑定占位符的准备好的语句。
仅仅因为从数据库返回值并不意味着该值可以安全地包含在 SQL 文本中。
您可能知道 mytable
中的 value
列是 INTEGER 类型,因此它是安全的。但在更一般的情况下,对于不知道 mytable
定义的 reader 以及 value
可能包含的内容。您的代码的 reader 将假定 value
不是 "safe"。据我们所知,我们可能会得到这样的结果:
Robert'); DROP TABLE students; --
每当我们看到一个变量连接到 SQL 文本中时,我们将假设变量 可能 包含值以外的其他内容,并且它可能包含实际 SQL。 (或者,如果我们确实看到一个变量连接到 SQL 语句的文本中,我们会期望它会在连接时正确转义。)
因此,首选模式是使用带有绑定占位符的准备好的语句。这使得 reader 明确 value
确实是一个值,并且它不打算被解释为 SQL 文本。
我有这样的查询:
$result = $db
-> prepare("SELECT value FROM mytable WHERE id = ?")
-> execute(array($id))
-> fetch(PDO::FETCH_ASSOC);
我想使用 $result['value']
作为另一个查询 (一个 UPDATE
语句) 的参数。我应该为该 UPDATE
语句使用准备好的语句吗?或者因为我已经从数据库中获取了它,所以不需要将它作为准备好的语句传递?
是的。使用带有绑定占位符的准备好的语句。
仅仅因为从数据库返回值并不意味着该值可以安全地包含在 SQL 文本中。
您可能知道 mytable
中的 value
列是 INTEGER 类型,因此它是安全的。但在更一般的情况下,对于不知道 mytable
定义的 reader 以及 value
可能包含的内容。您的代码的 reader 将假定 value
不是 "safe"。据我们所知,我们可能会得到这样的结果:
Robert'); DROP TABLE students; --
每当我们看到一个变量连接到 SQL 文本中时,我们将假设变量 可能 包含值以外的其他内容,并且它可能包含实际 SQL。 (或者,如果我们确实看到一个变量连接到 SQL 语句的文本中,我们会期望它会在连接时正确转义。)
因此,首选模式是使用带有绑定占位符的准备好的语句。这使得 reader 明确 value
确实是一个值,并且它不打算被解释为 SQL 文本。