zend db sql- preparestatementforsqlobject-仍然需要绑定或担心SQL注入



我正在使用ZF 2.4,并且在zend db sql中为此示例。我是否需要担心SQL注入,还是仍然需要进行Quote((或逃脱任何内容,如果我已经使用了PrepareTatementForsqlobject((?以下示例将是盲变量的?

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

use ZendDbSqlSql;
$sql = new Sql($adapter);
$select = $sql->select();
$select->from('foo');
$select->where(array('id' => $id));
$statement = $sql->prepareStatementForSqlObject($select);
$results = $statement->execute();

Select类将巧妙地检查您的谓词,并以安全的方式将其添加到查询中,以防止SQL注入。我建议您亲自查看来源,所以我将您指向该过程以及在最新的ZF版本中负责此的课程。

谓词处理
看看类Predicateset。方法ZendDbSqlPredicate::addPredicates确定基于其类型处理谓词的最佳方法。在您的情况下,您正在使用关联阵列。该数组中的每个项目将根据类型进行检查和处理:

  • 如果找到抽象替换字符(Question Marks(,它将变成Expression
  • 如果该值为NULL,则将在键:WHERE key IS NULL
  • 如果该值是数组,并且将在键中发现的Kolumn进行检查:WHERE key IN (arrayVal1, arrayVal2, ...)
  • 否则,谓词将是"等价"类型的新OperatorWHERE key = value

在每种情况下,要添加到Select的最终谓词将实现PredicateInterface

准备语句
方法ZendDbSqlSql::prepareStatementForSqlObject指示其适配器(即PDO(创建将准备的语句。从这里开始有些复杂。

ZendDbSql是在方法ZendDbSql::createSqlFromSpecificationAndParameters中使用函数vsprintf中的真正魔术发生的地方

注意
请考虑从现在开始使用新的docs.framework.zend.com网站。该网站在最新版本的文档中处于领先地位。

最新更新