14

我已经开始将 commons.lang 2 迁移到 commons.lang3。

根据 https://commons.apache.org/proper/commons-lang/article3_0.html

StringEscapeUtils.escapeSql

这是一种误导性的方法,只处理最简单的 SQL 案例。> 由于 SQL 不是 Lang 的重点,因此维护这种方法没有意义。

了解它,但建议使用什么来代替它?

澄清

您能推荐一个执行类似于 StringEscapeUtils.escapeSql 的简单 escapeSql 的第三方吗?

4

3 回答 3

19

从 Javadocs

目前这种方法只能将单引号变成双引号(“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 查询,您可以而且应该使用绑定变量,而不是尝试插入和转义字符串文字。

于 2015-08-19T13:30:41.527 回答
4

如果您使用的是 JDBC 连接,请准备一个带有以下参数的语句:

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

您不需要转义使用预准备语句中的函数插入的任何元素。那些会自动转义。

之前已经回答了这个问题: Java - escape string to prevent SQL injection

于 2015-08-19T13:31:20.637 回答
4

OWASP 有一个名为ESAPI的 API,它提供了其中一些功能,您可以查看一下。

于 2016-06-27T07:01:26.383 回答