SQLのLIKE検索のエスケープ

SQLを発行する際、SQLインジェクションとか注意する必要がある。
調べればすぐ分るけど、ちょっと忘れがちなのがLIKE検索の場合。
エスケープ文字ってDBによって異なるから、DBに依存しないでLIKE
のエスケープするメソッドを作ってみました。
MySQLでしか試してないから「どんなDBでも大丈夫」って言う自信
はないけど、一応以下な感じかな?


/**
* <code>con</code>からエスケープ文字列を取得する
*
* @param con
* Connection
* @return
* エスケープ用文字列
*/
public static String getEscapeChar(Connection con) {

if (con == null) {

System.out.println("illegal argument");
throw new IllegalArgumentException();
}

try {

DatabaseMetaData metaData = con.getMetaData();
return metaData.getSearchStringEscape();

} catch (SQLException e) {

throw new RuntimeException(e);
}
}

/**
* LIKE 検索を行う場合のデータ部分のエスケープ
*
* @param s
* エスケープ対象
* @param escape
* エスケープ文字列
* @return
* <code>s</code>にをエスケープシーケンスしたString
*/
public static String escape(Connection con, String s) {

if (StringUtils.isEmpty(s)) {

return s;

}

String escape = getEscapeChar(con);
StringBuffer sbuf = new StringBuffer();
for (int i = 0; i < s.length(); i++) {

char c = s.charAt(i);
if (c == '_') {

sbuf.append(escape);

} else if (c == '%') {

sbuf.append(escape);
}

sbuf.append(c);
}

return sbuf.toString();
}

0 コメント: