ダメでしょ!

プログラミングとか怒られた話とか…

iBatis で LIKE 文を使うときの注意点

はじめに…SQLインジェクション発生!

現在対応中の案件で、なぜか iBtais の利用が指定されている案件があるのですが、ここでSQLインジェクションを発生させてしまったので、自戒として記載します。

iBatis の動的パラメータ受け渡し

iBtaisには # と \$ が用意されていますが、# で囲まれたパラメータはエスケープされ、\$ で囲まれたパラメータはそのまま出力されます。
で、LIKE分を記述する際は、%を渡したかったので、

WHERE column1 LIKE $%value%$ 

と記述していたのですが、そうしたところ、'などを検索文字として渡した際にエラーが発生しました。
つまり、SQLインジェクションが発生してしまったわけです。

対応策

で、どうしたかというと、

WHERE column1 LIKE CONCAT('%', #value#, '%')

という風に、文字列連結を行うことで対応しました。
一部RDBではCONCATに対応していないみたいですが、MySQLOracleMSSQL等は問題なく動作するようです。
PostgreSQLはちょっとだけ微妙。
%を含んだ検索がうまくいかないようです。
実害はないようですが。