2017-05-02 8 views
1

J'utilise zf 2.4 et pour cet exemple dans Zend \ db \ sql. Ai-je besoin de m'inquiéter de l'injection sql ou ai-je encore besoin de faire un devis() ou d'échapper quoi que ce soit si j'utilise déjà prepareStatementForSqlObject()? L'exemple ci-dessous fera déjà la variable aveugle?Zend db sql - prepareStatementForSqlObject - faut-il encore lier ou s'inquiéter de l'injection 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(); 

Répondre

0

La classe Select sera intelligemment vérifier votre prédicat (s) et les ajouter de manière sûre à la requête pour éviter l'injection SQL. Je vous recommande de regarder la source par vous-même, je vous indiquerai donc le processus et les classes qui en sont responsables dans la dernière version de ZF.

prédicats Traitement
Jetez un oeil à la classe PredicateSet. La méthode \Zend\Db\Sql\Predicate::addPredicates détermine la meilleure façon de gérer votre prédicat en fonction de son type. Dans votre cas, vous utilisez un tableau associatif. Chaque élément de ce tableau sera vérifiée et traitée en fonction du type:

  • Si un caractère de remplacement d'abstraction (questionmark) se trouve, il sera transformé en un Expression.
  • Si la valeur est NULL, un IS NULL contrôle sera effectué sur la colonne trouvée dans la clé: WHERE key IS NULL.
  • Si la valeur est un tableau, et en échec seront effectuées sur la kolumn trouvée dans la clé: WHERE key IN (arrayVal1, arrayVal2, ...).
  • Sinon, le prédicat sera une nouvelle Operator du type « est égal à »: WHERE key = value.

Dans chaque cas, le prédicat final à ajouter à la Select sera mise en œuvre PredicateInterface

Préparation de la déclaration
La méthode \Zend\Db\Sql\Sql::prepareStatementForSqlObject indique son adaptateur (c.-à-PDO) pour créer une déclaration qui sera préparé. De là, ça devient un peu plus compliqué.

\Zend\Db\Sql est où la vraie magie se produit lorsque la méthode \Zend\Db\Sql::createSqlFromSpecificationAndParameters la fonction vsprintf est utilisé pour construire les chaînes de requête, que vous pouvez see here.

Remarque
Veuillez utiliser le nouveau site Web docs.framework.zend.com à partir de maintenant. Ce site web est leader en ce qui concerne la documentation de la dernière version.

+0

Comme je l'ai mentionné que je utilise 2.4 c'est pourquoi j'utilise ce document à la place. Merci pour l'info. – sparkmix

+0

Est-ce que cela vous aide? S'il vous plaît envisager d'accepter ma réponse si elle répond à votre question. –