iBatis で LIKE 文を使うときの注意点
はじめに…SQLインジェクション発生!
現在対応中の案件で、なぜか iBtais の利用が指定されている案件があるのですが、ここでSQLインジェクションを発生させてしまったので、自戒として記載します。
iBatis の動的パラメータ受け渡し
iBtaisには # と \$ が用意されていますが、# で囲まれたパラメータはエスケープされ、\$ で囲まれたパラメータはそのまま出力されます。
で、LIKE分を記述する際は、%を渡したかったので、
WHERE column1 LIKE $%value%$
と記述していたのですが、そうしたところ、'
などを検索文字として渡した際にエラーが発生しました。
つまり、SQLインジェクションが発生してしまったわけです。
対応策
で、どうしたかというと、
WHERE column1 LIKE CONCAT('%', #value#, '%')
という風に、文字列連結を行うことで対応しました。
一部RDBではCONCAT
に対応していないみたいですが、MySQL、Oracle、MSSQL等は問題なく動作するようです。
PostgreSQLはちょっとだけ微妙。
%
を含んだ検索がうまくいかないようです。
実害はないようですが。