2017-05-02 66 views
1

我在Zend \ db \ sql中使用zf 2.4和本例。如果我已经使用prepareStatementForSqlObject(),我需要担心sql注入还是需要执行quote()或转义任何东西?下面的例子已经做了盲变量了吗?Zend db sql - prepareStatementForSqlObject - 仍然需要绑定或担心sql注入?

https://framework.zend.com/manual/2.4/en/modules/zend.db.sql.html

use Zend\Db\Sql\Sql; 
$sql = new Sql($adapter); 
$select = $sql->select(); 
$select->from('foo'); 
$select->where(array('id' => $id)); 

$statement = $sql->prepareStatementForSqlObject($select); 
$results = $statement->execute(); 

回答

0

Select类将巧妙地检查你的谓词(S)和以安全的方式将它们添加到查询,以防止SQL注入。我建议你自己看一下源代码,所以我会告诉你最新的ZF版本的流程和负责这个的类。

谓词处理
看一看类PredicateSet。方法\Zend\Db\Sql\Predicate::addPredicates确定了根据其类型处理谓词的最佳方式。在你的情况下,你正在使用一个关联数组。该数组中的每一项将根据类型进行检查和处理:

  • 如果找到一个抽象替换字符(问号),它会变成一个Expression
  • 如果值为NULL,则将在密钥WHERE key IS NULL中找到的列上执行IS NULL检查。
  • 如果该值是一个数组,并且将在密钥中找到的列上执行IN检查:WHERE key IN (arrayVal1, arrayVal2, ...)
  • 否则,谓词将是类型'equals'的新OperatorWHERE key = value

在每种情况下的最终谓词被添加到Select将实施PredicateInterface

准备声明
方法\Zend\Db\Sql\Sql::prepareStatementForSqlObject指示其适配器(即PDO)来创建,这将是一个语句准备。从这里开始会变得更复杂一些。

\Zend\Db\Sql是真正的奇迹发生在哪里在方法\Zend\Db\Sql::createSqlFromSpecificationAndParameters功能vsprintf用于建立查询字符串,你可以see here

备注
从现在开始请考虑使用新的docs.framework.zend.com网站。当涉及到最新版本的文档时,该网站处于领先地位。

+0

正如我所说的,我正在使用2.4,所以这就是为什么我使用该文档。谢谢(你的)信息。 – sparkmix

+0

这对你有帮助吗?如果它回答你的问题,请考虑接受我的答案。 –