PDO_PGSQL驱动程序是否支持预处理语句?

时间:2014-07-07 14:19:39

标签: php sql postgresql pdo

我在我的项目中使用PosgreSQL和PDO。正如在此所述How can prepared statements protect from SQL injection attacks?默认情况下,PDO不会为不支持它的数据库驱动程序使用预准备语句。 PosgreSQL数据库驱动程序(PDO_PGSQL)是否支持预处理语句?谢谢。

2 个答案:

答案 0 :(得分:3)

默认情况下,PDO不使用 native 预处理语句,这意味着它在内部模拟预准备语句,而不是使用实际存在的数据库API。您可以通过将PDO::ATTR_EMULATE_PREPARES设置为false来关闭此行为。

  

PDO::ATTR_EMULATE_PREPARES启用或禁用已准备好的模拟   声明。某些驱动程序不支持本机预处理语句或   对他们的支持有限。使用此设置可以强制PDO   始终模拟准备好的语句(如果TRUE),或尝试使用   本机预处理语句(如果FALSE)。它总是会回归   如果驱动程序无法成功,则模拟准备好的语句   准备当前查询。

     

http://www.php.net/manual/en/pdo.setattribute.php

这只是(希望)澄清你的陈述。

PDO_PGSQL 支持本地准备好的陈述since 0.9,该陈述大约在10年前发布。

答案 1 :(得分:3)

简短版本是为了防止SQL注入,它并不重要。

在数据库驱动程序中正确实现和一致的参数转义足以提供与使用服务器端参数化语句相同级别的SQL注入保护。

如果PDO使用PostgreSQL的bind-parse-execute协议让服务器处理参数化语句,那就太好了,但这样做并不重要。

建议人们使用参数化语句(通常不准确地称为"准备好的语句")的目的是确保它们与构造语句的方式一致。如果所有转义都通过一个具有正确编写框架的单个入口点进行,并且您遵循有关使用该框架的严格规则,那么您就不太可能留下意外的SQL注入漏洞。

您实际上希望PDO为非DML / SELECT语句执行参数化语句仿真,因为PostgreSQL的有线协议不支持DDL的参数绑定。