「SQLを動的に組み立てる」とは

「SQLインジェクション対策」でGoogle検索して上位15記事を検証した - ockeghem's blog」が、とてもためになるエントリだと後輩に紹介したら、夜、飲み屋で「SQLインジェクション対策」の話になった。
で、なんか『SQLを動的に組み立てる』っていう言葉のイメージを取り間違えていたっぽいので、(酔ってはいるが)忘れないうちにメモしておく。


ココで言う『SQLを動的に組み立てる』というのは、「外部から取得した(汚染されている可能性のある)値、あるいはその一部を直接SQL文の一部として、動的に組み立てる」という意味。「安全なSQLの呼び出し方」にも『SQL文を生成するとき、パラメータ部分への値の埋め込みを文字列連結によって実現する方法』とある。
外部から取得した値を用いて条件分岐し、あらかじめ組み立てていたSQL文の一部(where句など)を動的に組み替えることは、これに該当しない(つまり、安全)。条件によってwhere句を変更するようなケースは、業務ロジックを書いていたって、しょっちゅうお目にかかる。iBATISだってサポートしているし(SSI*1の人はよく使うはず)。で、こうやって生成したプレースホルダを含むSQL文を、プリペアドステートメントを用いて準備しておき、値をバインドする。これは問題ない。

*1:死語?SSIは、StrutsSpring FrameworkiBATIS の略。