防止从表单生成的SQL注入SQL - 没有PreparedStmts

时间:2010-05-17 20:29:34

标签: java sql regex security sql-injection

我有一个搜索表,用户可以使用以下类型的过滤器过滤结果:

  • 字段[名称],值[约翰],删除 规则
  • Field [Surname],Value [Blake], 删除规则
  • Field [有孩子],价值[是], 删除规则
  • 添加规则

因此,用户将能够设置任意一组过滤器,这将基本上产生一个完全动态的WHERE子句。将来我还必须实现更复杂的逻辑表达式,比如

其中(姓名= John OR name = Nick)AND(姓氏= Blake OR姓氏= Bourne),

在用户可能过滤或未过滤的所有10个字段中,我不知道用户将设置多少个过滤器。所以,我不能使用预准备语句(假设至少我们知道WHERE子句中的字段)。这就是为什么准备好的语句不可避免的问题,我必须用普通的旧生成的SQL来做。

我可以采取哪些措施来保护应用程序免受SQL注入(REGEX方式或任何其他方式)?

3 个答案:

答案 0 :(得分:5)

Java,未经测试。

List<String> clauses = new ArrayList<String>();
List<String> binds = new ArrayList<String>();

if (request.name != null) {
    binds.add(request.name);
    clauses.add("NAME = ?");
}

if (request.city != null) {
    binds.add(request.city);
    clauses.add("CITY = ?");
}

...

String whereClause = "";

for(String clause : clauses) {
    if (whereClause.length() > 0) {
        whereClause = whereClause + " AND ";
    }
    whereClause = whereClause + clause;
}

String sql = "SELECT * FROM table WHERE " + whereClause;

PreparedStatement ps = con.prepareStatment(sql);

int col = 1;
for(String bind : binds) {
    ps.setString(col++, bind);
}

ResultSet rs = ps.executeQuery();

答案 1 :(得分:2)

如果您为预准备语句添加参数,它们将自动转义。

conn = pool.getConnection( );
String selectStatement = "SELECT * FROM User WHERE userId = ? ";
PreparedStatement prepStmt = con.prepareStatement(selectStatement);
prepStmt.setString(1, userId);
ResultSet rs = prepStmt.executeQuery();

答案 2 :(得分:2)

SQL Server: Dynamic where-clause

动态构建where子句,但使用参数名称来执行。