ikepyonのだめ人間日記

セキュリティに関することを書いていく予定。

ストアドプロシジャがSQLインジェクション対策になるのか?

なるか?というと常にはならない気が。
ストアドプロシジャはSQL文をコンパイルしてDBMS側に保存しておくためのものであって、呼び出し方によっては、SQLインジェクション対策にはならないと思うのだけどどうなんでしょ?
SQL文でストアドプロシジャを呼び出すときは以下のような形で呼び出すことになると思う。これは、SQL Serverの例だけど(参照:http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/odssql/ods_6_con_01_1ptb.asp

EXECUTE au_info 'Dull', 'Ann'

従って、例えば以下のようなコードの場合、ストアドプロシジャを使っていてもSQLインジェクション対策にはならない。

String sql = "execute au_info '" + prm1 + "', '" + prm2 + ';";
statement.executeQuery(sql);

こんなコードを使ってる場合は、prm1とprm2にエスケープ処理をしないといけない。(つうか、大昔にこういったコードを大量に書いてたorzあのシステムさすがにもう動いてないよね)
本来であれば、こんな感じのほうがいいみたいだけどね。

String sql = "execte au_info ?,?;"
CallableStatement stat = con.prepareCall(sql);
stat.setString(1, prm1);
stat.setString(2, prm2);
stmt.executeQuery();

デモこれって、Prepared Statementと書き方同じだし、呼び出し方のコードによっては、SQLインジェクションが発生するので、SQLインジェクション対策として、ストアドプロシジャを進めるのはどうかなぁ?
まあ、環境に依存するんだろうけど・・・