如何在动态查询中保护自己免受SQL注入?

时间:2011-06-07 06:59:18

标签: java sql oracle sql-injection

我的应用程序获取对数据库的String对象查询。例如。 String query = EMAIL like '% test%' and USER_NAME like '% user%'。查询是动态构建的,我不知道它的结构,因此我无法利用PrepareStatement。有谁知道在这种情况下防止SQL注入的方式?

数据库:Oracle
语言:Java 1.6

请帮忙。

4 个答案:

答案 0 :(得分:9)

即使您不知道结构,也可以使用PreparedStatement。让我用一个简单的例子来证明:

List<Object> arguments = new ArrayList<Object>();
String sql = "SELECT * FROM user WHERE someCondition = ?";
if (queryOnEmail) {
  sql = sql + " AND email LIKE ?";
  arguments.add(email);
}
if (queryOnUserName) {
  sql = sql + " AND user_name LIKE ?";
  arguments.add(userName);
}
PreparedStatement stmt = con.prepareStatement(sql);
int i = 1;
for(Object o : arguments) {
  stmt.setObject(i, o);
  i++;
}

当然,您可以将此SQL +参数构造包装到其自己的类中,以简化其用法。

答案 1 :(得分:0)

您可以在构建查询时动态构建语句的变量列表,并使用PreparedStatement。

答案 2 :(得分:0)

正如this post中所解释的,应用程序可能发生的事情比经典表格DROP更多:

最重要的是,在构建SQL语句时,不应该使用字符串连接。为此目的使用专用API:

答案 3 :(得分:-6)

此外:始终信任用户输入始终是一种良好做法。在处理任何输入数据之前,首先删除所有转义和特殊字符: String.replace("\\" | "\"", "");