假设我有一个查询,例如SELECT * FROM my_table where name = 'Debbie O'Brian'
。正如您在SQL Server中所知,我们只需要放置另一个'
来使其忽略单引号。这是我喜欢自动做的事情。
简而言之,我需要在两个封闭的'
之间用''
替换所有出现的'
。
以下是我到目前为止的情况:
String text = "SELECT * FROM my_table where name = 'Debbie O'Brian'";
String[] splitArray = text.split(" '");
for (int i = 0; i < splitArray.length; i++) {
String str = splitArray[i];
if (str.endsWith("'"))
str = str + " ";
// replace all single quotes
str = str.replace("'", "''");
// revert last replacement
str = str.replace("'' ", "' ");
splitArray[i] = str;
}
StringBuilder builder = new StringBuilder();
for (int i = 0; i < splitArray.length; i++) {
builder.append(splitArray[i]).append(" '");
}
System.out.println(builder.substring(0, builder.length() - 2).toString());
问题是我在开始'
之前依赖于空格的存在。我的问题是,如果没有这种预先假设,我怎么能这样做呢?
任何帮助(甚至建议算法)都非常感谢。请注意,查询中可能有多个单引号字符串。
编辑:我正在使用Hibernate来执行本机SQL并将整个SQL查询作为输入。
答案 0 :(得分:4)
在SQL查询中处理单引号和其他特殊字符的最佳方法是使用参数化查询。它也更安全。我建议搜索“SQL注入”。这将教你如何防止和处理查询中的单引号。
答案 1 :(得分:4)
如果您使用JDBC
PreparedStatement ps = conn.prepareStatement("SELECT * FROM my_table where name = ?")
ps.setString(1, name);
答案 2 :(得分:1)
当你使用Hibernate时,类似于@ B.O.B所说的使用参数化查询:
String queryString = "SELECT * FROM my_table where name = :name";
Query query = getSession().createSQLQuery(queryString);
query.setString("name", name);
答案 3 :(得分:0)
好的,正如我上面提到的,我的问题不是SQL注入。我所追求的,在这一点似乎是不可能的,除非我实现一个显然太多的SQL解析器。因此,我将坚持我的预先假设并放弃尝试修复错误的输入,正如两个人在评论中提到的那样。
感谢大家的回答。