如何为SQL插入转义单引号...当要插入的字符串位于用户生成的变量中时

2022-09-01 13:45:19

我正在构建一个插入命令以使用jdbc执行。它的一部分是连接用户生成的字符串...这一切都有效,直到用户使用如下字符串:

a'bcd

String userString="a'bcd";
String insertTableSQL = "INSERT INTO myTable "
                            + "(insertColumn) " 
                            + "VALUES("
                                +"'"+userString+"'"
                                +")";

statement.executeUpdate(insertTableSQL);

答案 1

您可以执行以下任一操作:

  1. 使用“准备语句”类。(推荐))

    String userString="a'bcd";
    String myStatement = " INSERT INTO MYTABLE (INSERTCOLUMN) VALUES (?)";
    PreparedStatement statement= con.prepareStatement   (myStatement );
    statement.setString(1,userString);
    statement.executeUpdate();
    
  2. 转义单引号。

    在 SQL 中,单引号将使用双单引号进行转义。' --> ''

    String userString="a'bcd";
    String changedUserString = userString.replace("'","''");
            //changedUserString  = a''bcd
    String insertTableSQL = "INSERT INTO myTable (insertColumn) VALUES("
                            +" '"+changedUserString +"' )";
    

答案 2

您可以使用 Apache Commons Lang 库中的 StringEscapeUtils。使用此功能,您可以从html,xml,sql等中转义字符。寻找适合您目的的方法。参考:当我需要转义Html字符串时?escapeXXX

注意:在Apache Commons Lang 3中被删除(参见从commons.lang迁移StringEscapeUtils.escapeSql,它引用了 https://commons.apache.org/proper/commons-lang/article3_0.html#StringEscapeUtils.escapeSqlescapeSql)

例如:

String str = FileUtils.readFileToString(new File("input.txt"));
        String results = StringEscapeUtils.escapeHtml(str);
        System.out.println(results);

输入:

<sometext>
Here is some "Text" that I'd like to be "escaped" for HTML
& here is some Swedish: Tack. Vars?god.
</sometext>

输出:

&lt;sometext&gt;
Here is some &quot;Text&quot; that I'd like to be &quot;escaped&quot; for HTML
&amp; here is some Swedish: Tack. Vars&aring;god.
&lt;/sometext&gt;

推荐