Php PDO中准备好的语句真的提高了安全性吗?

Php PDO中准备好的语句真的提高了安全性吗?,php,security,pdo,Php,Security,Pdo,我想知道那些准备好的PDO语句是否真的提高了安全性,或者它们是否只是查询中的“廉价”文本替换。准备好的语句的要点实际上是,作为参数插入的任何内容都不会被DBMS解析为指令本身的一部分,因此 "'; DROP TABLE foobar;" 没有效果,也不会中断查询。有人知道这个细节吗?我想使用PDO和准备好的语句来防止sql注入。事实证明,它们很难使用(而且甚至不工作,至少在我本地的机器上是这样),所以我想在浪费更多时间使用PDO之前找出这个问题;-) 是的,它们增加了安全性。与PHP中的常规M

我想知道那些准备好的PDO语句是否真的提高了安全性,或者它们是否只是查询中的“廉价”文本替换。准备好的语句的要点实际上是,作为参数插入的任何内容都不会被DBMS解析为指令本身的一部分,因此

"'; DROP TABLE foobar;"

没有效果,也不会中断查询。有人知道这个细节吗?我想使用PDO和准备好的语句来防止sql注入。事实证明,它们很难使用(而且甚至不工作,至少在我本地的机器上是这样),所以我想在浪费更多时间使用PDO之前找出这个问题;-)

是的,它们增加了安全性。与PHP中的常规MYSQL方法相比,PDO或MySQLi还提高了速度,因为数据以更紧凑的形式传递。

创建一个准备好的语句会将带有通配符的查询发送到服务器进行解析,并返回一个令牌来调用该语句

调用只涉及发送绑定到每个参数的数据。这意味着不会对数据进行解析(因为它不是查询字符串的一部分),并且在解析准备好的语句时,查询的结构是固定的,不能通过注入来更改

所以,是的,事先准备好的声明肯定会提高安全性


这还意味着,如果您将准备好的语句重复用于多个请求,则不必产生解析开销。

投票结束,因为谷歌提出了前一个SO问题,回答了这个问题。您在分号后添加另一个语句的示例称为“查询堆叠”-当使用某些语言模块时,查询堆栈仅在某些DBMS上工作,并且不是通用的。通用的做法是通过sql关键字(如AND、OR、UNION、ORDER BY等)向现有查询中添加新的sql位。简单地说,准备好的语句或任何类型的“参数化语句”都可以确保用户的数据只被视为数据,而不被视为代码。