0

我有以下代码来执行 sql 查询:

query = String.format("select * from users where user_name = '%s';", results.getString(1));
results2 = mStmt.executeQuery(query);

数据集中的一个 user_name 的值为“O'brien”。由于“O'brien”中的单括号,这破坏了我的查询。查询将变为:

select * from users where user_name = 'O'brien'

克服这个问题而不修改数据的策略是什么?

编辑:准备好的语句确实解决了单引号问题,但这只是问题的一部分。我拥有的字符串值之一包含单词“UNDER”。这是一个 SQL 关键字。例如,我有一个名为 insertAll 的preparedStatement,查询如下:

insert into names (id, val1, val2, val3, val4, tTime, val5) values (?, ?, ?, ?, ?, ?, ?)

感谢所有的帮助!

4

2 回答 2

5

使用 prepareStatement 设置参数。您的代码是书中的 SQL 注入可利用代码。 http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

于 2012-11-30T04:14:05.347 回答
1

为什么不改用PreparedStatement,避免在 sql 查询中完全转义引号这一繁琐且容易出错的问题?

可能看起来像这样(对不起,我实际上并没有运行它,但你应该明白了):

query = "select * from users where user_name = ?";
PreparedStatement p = new PreparedStatement(con, query);
p.setString(1, results.getString(1));
results2 = p.executeQuery();
于 2012-11-30T04:19:02.527 回答