SQLインジェクション対策

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.