web-dev-qa-db-ja.com

commons.langからStringEscapeUtils.escapeSqlを移行する

Commons.lang2をcommons.lang3に移行し始めました。

https://commons.Apache.org/proper/commons-lang/article3_0.html によると

StringEscapeUtils.escapeSql

これは誤解を招く方法であり、考えられる最も単純なSQLケースのみを処理していました。 > SQLはLangの焦点では​​ないため、このメソッドを維持することは意味がありませんでした。

理解できますが、代わりに何を使用することをお勧めしますか?

説明

StringEscapeUtils.escapeSqlに似た単純なescapeSqlを実行するサードパーティをお勧めできますか?

11
Michael

Javadocから

現在、このメソッドは一重引用符を二重引用符に変換するだけです( "McHale's Navy" => "McHale ''s Navy")。

これはメソッドコードでした:

  /**
675         * <p>Escapes the characters in a <code>String</code> to be suitable to pass to
676         * an SQL query.</p>
677         *
678         * <p>For example,
679         * <pre>statement.executeQuery("SELECT * FROM MOVIES WHERE TITLE='" + 
680         *   StringEscapeUtils.escapeSql("McHale's Navy") + 
681         *   "'");</pre>
682         * </p>
683         *
684         * <p>At present, this method only turns single-quotes into doubled single-quotes
685         * (<code>"McHale's Navy"</code> => <code>"McHale''s Navy"</code>). It does not
686         * handle the cases of percent (%) or underscore (_) for use in LIKE clauses.</p>
687         *
688         * see http://www.jguru.com/faq/view.jsp?EID=8881
689         * @param str  the string to escape, may be null
690         * @return a new String, escaped for SQL, <code>null</code> if null string input
691         */
692        public static String escapeSql(String str) {
693            if (str == null) {
694                return null;
695            }
696            return StringUtils.replace(str, "'", "''");
697        }

したがって、メソッドをString#replaceへの単純な呼び出しで簡単に置き換えることができます。

ただし、メソッドが削除された理由があります。本当に中途半端で、使いたくなる理由が思い浮かびません。たとえば、JDBCクエリを実行するには、文字列リテラルを補間してエスケープする代わりに、バインド変数を使用できます。

15
Thilo

JDBC接続を使用している場合は、次のようなパラメーターを使用してステートメントを準備します。

con.prepareStatement("INSERT INTO table1 VALUES (?,?)");
pstmt.setInt(1, 200);
pstmt.setString(2, "Julie");
pstmt.executeUpdate();

プリペアドステートメントの関数を使用して挿入する要素をエスケープする必要はありません。それらは自動的にエスケープされます。

これは以前に次のように回答されています: Java-SQLインジェクションを防ぐためのエスケープ文字列

3
Matjaž Pečan

[〜#〜] esapi [〜#〜] と呼ばれるOWASPによるAPIがあり、これらの関数のいくつかを提供します。チェックアウトできます。

2
bub