Zend FrameworkのSQLモデルを使用する場合のSQLインジェクションの脆弱性
テーブルを結合するとき、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&section=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注入の適切な図ではありません。とにかく、これは整数値を期待するとき、および整数入力をフィルタリングしないときに可能です。以下の私のコメントをご覧ください。