【问题标题】:How to escape single quotes for SQL insert...when string to insert is in a user generated variable如何为 SQL 插入转义单引号...当要插入的字符串在用户生成的变量中时
【发布时间】:2014-12-07 12:26:20
【问题描述】:

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

a'bcd

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

statement.executeUpdate(insertTableSQL);

【问题讨论】:

标签: java sql jdbc


【解决方案1】:

您可以使用Apache Commons Lang 库中的StringEscapeUtils。 使用它,您可以转义 html、xml、sql 等中的字符。根据您的目的查找方法 escapeXXX。供参考:When i need to escape Html string?

注意:escapeSql 已在 Apache Commons Lang 3 中删除(请参阅引用 https://commons.apache.org/proper/commons-lang/article3_0.html#StringEscapeUtils.escapeSqlMigrating StringEscapeUtils.escapeSql from commons.lang

例如:

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;

【讨论】:

  • 在StringEscapeUtils文档中forescapeSQL:“目前这种方法只能把单引号变成双单引号”
  • StringEscapeUtils.escapeSql 是depreciated
  • 此方法仅在您打算稍后将输入用作 HTML 输出时才有效。关于弃用,commons-lang v3.6 仍然存在,并且可以与 org.apache.commons.text.StringEscapeUtils 一起正常工作。
【解决方案2】:

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

  1. 使用 PreparedStatement 类。 (推荐

    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 +"' )";
    

【讨论】:

    【解决方案3】:

    这是另一个选择:

    使用专门为此目的设计的原生 Android 方法:

    DatabaseUtils.sqlEscapeString(String)
    

    这是它的在线文档:

    在我看来,使用这种方法的主要优点是由于方法名称清晰,所以可以自行编写文档。


    String userString="a'bcd";
    String insertTableSQL = "INSERT INTO myTable "
                                + "(insertColumn) " 
                                + "VALUES("
                                    +"'"+DatabaseUtils.sqlEscapeString(userString)+"'"
                                    +")";
    
    statement.executeUpdate(insertTableSQL);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-26
      相关资源
      最近更新 更多