web-dev-qa-db-ja.com

Joomlaテンプレート/ビューでの直接SQLリクエストの安全性

Virtuemartカテゴリページに表示される製品の順序を変更する必要があります。ファイルmodels/product.phpおよびtables/products.phpは複雑すぎて変更を加えることができません。したがって、views/category/default.php(より正確にはtemplates/my_template/html/com_virtuemart/category/default.phpの場合)で次のように直接SQL要求を使用することにしました。

$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();
...

一部のビューまたはテンプレートで直接SQL要求を使用する必要があるのは、これだけではありません。

しかし、そのような直接的な方法はどの程度安全であり、それを可能な限り最大限に保護する方法ですか?

2
stckvrw

JoomlaはMVC設計パターンに基づいて構築されているため、ビューからデータベースにクエリを実行することはお勧めできません。しかし、あなたのシナリオで、いくつかの代替案を考えてみましょう:

  • モデルの変更:これは意味がありません。所有していないモデルを変更することはできません。そうしないと、変更の適用に縛られます。新しいリリースごとに;さらに、あなたはそれが過度に複雑であると述べました。
  • テンプレートからのクエリ:現在のソリューションはスケーラブルではなく、Joomlaキャッシュを適切に活用していません。
  • モデルの作成:(またはヘルパー)、適切なVMフォルダー内に配置し、ビューから呼び出します:間違いなく最も魅力的なソリューション:オーバーヘッドなし、より単純なコード、さらに次のようなJoomlaの機能を活用します:cacheと適切な設計パターンの使用、問題の分離により、将来のメンテナンスが容易になります。

現在のソリューションを検討するには:

  • あなたはnot脆弱性を導入しています:コードはクエリパラメータを適切にエスケープするため、そこから予期しない結果が生じることはありません。
  • あなたはベストプラクティスに従っていません。クエリがより複雑になると、コードの保守が難しくなります。他の開発者はあなたの仕事を見つけるのが少し難しいかもしれません。
  • コードはJoomlaキャッシュを適切に使用できません(ページキャッシュのみが機能します)。小さなお店なら問題ありません。しかし、製品の数が多いと、パフォーマンスが影響を受けます

結論

作業が概念実証である場合は、現在のソリューションを使用してください。これがライブWebサイトである場合は、少し時間をかけてクエリをコーディングするヘルパーまたはモデルを作成してください。柔軟性と再利用性が得られ(2つのビューが同じデータを必要とする場合は、コードを複製する必要はありません)、将来の時間を節約できます。

4
Riccardo Zorn