java - 如何保护自己免受动态查询中的 SQL 注入(inject)攻击?

标签 java sql oracle sql-injection

我的应用程序获取一个字符串对象查询到数据库。例如。 字符串查询 = 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/

相关文章:

MySQL查询获取最近7天出现次数最多的前50个名字

php - MySQL 哪里有很多多对多的匹配项?

使用不同的数据和序列填充 SQL

oracle - 有多少记录可以包含 GLOBAL TEMPORARY TABLE ON COMMIT PRESERVE ROWS?

sql - 性能 : Subquery or Joining

java - 'Stock stock = new Stock("HR.S")' 如何导致输出?

java - 什么对象可用于在 Web 应用程序到达 JSP 或 Servlet 之前拦截所有请求?

java - 使用Kafka消费者池是否正确?

sql - Oracle 分层总和(叶到根的距离)

java - && 运算符真的比 || 具有更高的优先级吗?运算符(operator) ?看代码