我正在构建一个使用jdbc执行的insert命令。部分原因是连接用户生成的字符串......这一切都有效,直到用户使用这样的字符串:
a'bcd
String userString="a'bcd";
String insertTableSQL = "INSERT INTO myTable "
+ "(insertColumn) "
+ "VALUES("
+"'"+userString+"'"
+")";
statement.executeUpdate(insertTableSQL);
答案 0 :(得分:40)
您可以执行以下任一操作:
使用 PreparedStatement 类。 (推荐)
String userString="a'bcd";
String myStatement = " INSERT INTO MYTABLE (INSERTCOLUMN) VALUES (?)";
PreparedStatement statement= con.prepareStatement (myStatement );
statement.setString(1,userString);
statement.executeUpdate();
逃避单引号。
在SQL中,单引号将使用双引号进行转义。 '
- > ''
String userString="a'bcd";
String changedUserString = userString.replace("'","''");
//changedUserString = a''bcd
String insertTableSQL = "INSERT INTO myTable (insertColumn) VALUES("
+" '"+changedUserString +"' )";
答案 1 :(得分:7)
您可以使用StringEscapeUtils库中的Apache Commons Lang。
使用它你可以转义html,xml, sql 等字符。为你的目的寻找方法escapeXXX
。供参考:When i need to escape Html string?
注意:escapeSql
已在Apache Commons Lang 3中删除(请参阅Migrating StringEscapeUtils.escapeSql from commons.lang引用https://commons.apache.org/proper/commons-lang/article3_0.html#StringEscapeUtils.escapeSql)
例如:
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>
输出:
<sometext>
Here is some "Text" that I'd like to be "escaped" for HTML
& here is some Swedish: Tack. Varsågod.
</sometext>
答案 2 :(得分:1)
这是另一种选择:
使用专为此目的而设计的原生Android方法:
DatabaseUtils.sqlEscapeString(String)
以下是在线文档:
在我看来,使用这种方法的主要优点是自我记录,因为方法名称清晰。
String userString="a'bcd";
String insertTableSQL = "INSERT INTO myTable "
+ "(insertColumn) "
+ "VALUES("
+"'"+DatabaseUtils.sqlEscapeString(userString)+"'"
+")";
statement.executeUpdate(insertTableSQL);