我的应用程序获取一个字符串对象查询到数据库。例如。 字符串查询 = EMAIL like '% test%' 和 USER_NAME like '% user%'
。查询是动态构建的,我不知道它的结构,所以我无法利用 PrepareStatement
。有谁知道在这种情况下可以防止 SQL 注入(inject)的方法吗?
数据库:甲骨文
语言:Java 1.6
请帮忙。
最佳答案
即使您不知道结构,您也可以使用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 + 参数构造包装到它自己的类中以简化其使用。
关于java - 如何保护自己免受动态查询中的 SQL 注入(inject)攻击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6261636/