SQLインジェクション対策 動的SQLはやめましょう! 1 Copyright 2016 G1Systems Inc. SQLの動的生成を避ける1 WHERE (Col1 = :Para1 AND Col2 = :Para2 -- これは任意の条件 AND Col3 = :Para3) -- これは任意の条件 OR (Col4 = :Para4) -- これは任意の条件 任意の(必須でない)抽出条件が多いと、分岐だらけの動 的SQL(文字列連結)になりがち。 プログラム自体は簡単ですが、最終的に動作するSQLが見 通せない。 → バグ・工数増大・保守性悪化 2 Copyright 2016 G1Systems Inc. ストアドプロシージャで動的生成すると…… vSQL := vSQL || 'WHERE Col1 = ''' || Para1 || ''''; IF Para2 NOT IS NULL THEN vSQL := vSQL || ' AND Col2 = ''' || Para2 || ''''; END IF; IF Para3 NOT IS NULL THEN vSQL := vSQL || ' AND Col3 = ''' || Para3 || ''''; END IF; IF Para4 NOT IS NULL THEN vSQL := vSQL || ' OR Col4 = ''' || Para4 || ''''; END IF; 3 Copyright 2016 G1Systems Inc. こうして動的生成を避ける WHERE (Col1 = :Para1 AND (Col2 = :Para2 OR :Para2 IS NULL) AND (Col3 = :Para3 OR :Para3 IS NULL)) OR (Col4 = :Para4 AND :Para4 NOT IS NULL) IN・EXISTS を使ったサブクエリ になっても、もちろん OK! 任意のパラメータが NULL だったとき、パース時に消える ので、 Col2、Col3 にインデックスがあって、片方が指定 されたとき、適切なインデックスを使う。 4 Copyright 2016 G1Systems Inc. 違和感のある人は論理演算を再復習しよう! AND(論理積)は掛け算、OR(論理和)は足し算 True は1(以上) False は0 として、簡単な数式に直して考えてみましょう。 参考 http://qiita.com/kantomi/items/1c1f3ee99031d7e4b6a2 5 Copyright 2016 G1Systems Inc.
© Copyright 2025 ExpyDoc