テーブルを結合するとき、Zend FrameworkのSQLモデルを使用します。例として、実際のコードを変更しましたが、ポイントが得られると思います。
$this->getSelect()->join(
array('sections' => $sectionsTableName),
'main_table.banner_id = pages.banner_id',
array()
)
->where("sections.section= '$section' OR sections.section = '0' OR (sections.section = '6' AND ? LIKE main_table.url)",$url)
->group('main_table.banner_id');
ページはajaxでロードされ、$ sectionパラメーターはGETパラメーター(www.example.com/controllerName/index/display/3?paremeter1=example§ion=www.example2.com
)として送信されます。
誰かが次のようなことを実行した場合の問題は次のとおりです。
www.example.com/controllerName/index/display/3?paremeter1=example&url=(SELECT 3630 FROM(SELECT COUNT(*),CONCAT(0x7170786a71,(SELECT (ELT(3630=3630,1))),0x717a716b71,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)
このようにして、ユーザーはデータベース全体をダンプできます。データは表示されませんが、SQLはダンプを実行するため、SQLのオーバーロードが発生する可能性があります。
質問:
- そのようなシナリオを防ぐ最良の方法は何ですか?
- 今、私は以前の顧客を心配しています。このコードを使用すると、テーブルの更新や変更など、さらにリスクの高いアクションを実行できますか?DELETEがsql構文エラーを生成するように、SELECT以外のステートメントをsubselect内に配置できないためだと思います。私は正しいですか?
更新: 私の例は、$セクションの周りに記号があり、したがって注入を行うことができないため、SQL注入の適切な図ではありません。とにかく、これは整数値を期待するとき、および整数入力をフィルタリングしないときに可能です。以下の私のコメントをご覧ください。
'
符号の前に(
符号があり、したがって、(SELECT
または他のものは文字列であり、機能しません。フィールドが整数の場合、'
必要はなく、そのようなシナリオが可能になります。ただし、整数は常にフィルタリングする必要があるintval()
ため、これも問題になりません。
'
か?だから' AND (SELECT ...) '
?ちなみに、Zendがこれを引用していないとは思わない...そして、バインディングを使用すると、PDOがこれを処理します。このような刺し刺した連結を決して使用しないで"sections.section= '$section'"
$db = Mage::getSingleton('core/resource')->getConnection('core_read');
そして$db->quote()
あなたの場合でさえ見てください$db->quoteInto
。$this
がリソースの場合、実行できます:$this->getConnection('core_read')->quoteInto()
それがコレクションの場合、実行できます$this->getResource()->getConnection('core_read')->quoteInto()
。それらの線に沿って。それがあなたの目標に向かってあなたを導くのに役立つなら。