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

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

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

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

Where(name = John OR name = Nick)AND(surname = Blake OR surname = Bourne),

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

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

最佳答案
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();

转载注明原文:java – 防止从表单生成的SQL注入SQL – 没有PreparedStmts - 代码日志