web-dev-qa-db-fra.com

La sécurité des requêtes SQL directes dans les modèles / vues Joomla

Je dois modifier l'ordre dans lequel les produits sont affichés sur la page de catégorie Virtuemart. Les fichiers models/product.php et tables/products.php sont trop compliqués pour que je mette les changements en eux. J'ai donc décidé d'utiliser des requêtes SQL directes dans views/category/default.php (si plus précisément dans templates/my_template/html/com_virtuemart/category/default.php) comme:

$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('a.virtuemart_product_id');
$query->from('#__virtuemart_product_categories AS a');
$query->where($db->quoteName('virtuemart_category_id')." = ".$db->quote($this->category->virtuemart_category_id));
$query->select('b.product_in_stock, c.product_price');
$query->join('LEFT', '#__virtuemart_products AS b ON b.virtuemart_product_id = a.virtuemart_product_id');
$query->join('LEFT', '#__virtuemart_product_prices AS c ON c.virtuemart_product_id = a.virtuemart_product_id');
$query->order('b.product_in_stock DESC, c.product_price DESC');
$db->setQuery($query);
$sortedProducts = $db->loadObjectList();
...

Ce n'est pas le seul cas où j'ai eu besoin d'utiliser des requêtes SQL directes dans certaines vues ou dans des modèles.

Mais dans quelle mesure cette voie directe est-elle sûre et comment la protéger le plus possible?

2
stckvrw

Joomla est construit sur le modèle de conception MVC, il est donc déconseillé d'interroger la base de données à partir d'une vue. Mais avec votre scénario, considérons quelques alternatives:

  • changer de modèle : cela n'a aucun sens: vous ne pouvez pas modifier un modèle que vous ne possédez pas, ou vous serez lié à l'application de vos modifications à chaque nouvelle version; en outre, vous mentionnez que c'est trop compliqué;
  • requête à partir du modèle : votre solution actuelle, non évolutive, ne exploite pas correctement le cache Joomla.
  • créer un modèle: (ou un assistant), placez-le dans le dossier VM) approprié et appelez-le depuis votre affichage: la solution la plus attrayante: aucuns frais généraux, un code plus simple, vous exploitez en outre les fonctionnalités de Joomla, notamment: cache et une utilisation appropriée du modèle de conception avec séparation des problèmes, facilitant ainsi la maintenance pour votre avenir.

Pour considérer votre solution actuelle:

  • Vous êtes pas introduisant une vulnérabilité quelconque: votre code échappe correctement aux paramètres de la requête afin qu'aucun résultat inattendu ne puisse en découler;
  • Vous ne suivez pas les meilleures pratiques; Si vos requêtes deviennent plus complexes, votre code sera plus difficile à gérer. d'autres développeurs peuvent trouver un peu plus difficile de trouver votre travail;
  • Le code ne peut pas utiliser correctement le cache Joomla (seul le cache de page fonctionnera); avec un petit magasin, pas de problèmes; mais avec un plus grand nombre de produits, les performances seront affectées

Conclusions

Si votre travail est une preuve de concept, optez pour votre solution actuelle; S'il s'agit d'un site Web actif, investissez un peu de votre temps pour créer un assistant ou un modèle dans lequel vous coderez vos requêtes. Vous gagnerez en flexibilité, en capacité de réutilisation (si deux affichages nécessitent les mêmes données, vous n'avez pas besoin de dupliquer le code) et vous gagnerez du temps à l'avenir.

4
Riccardo Zorn