我有一个搜索表,用户可以使用以下类型的过滤器过滤结果:
因此,用户将能够设置任意一组过滤器,这将基本上产生一个完全动态的WHERE子句。将来我还必须实现更复杂的逻辑表达式,比如
其中(姓名= John OR name = Nick)AND(姓氏= Blake OR姓氏= Bourne),
在用户可能过滤或未过滤的所有10个字段中,我不知道用户将设置多少个过滤器。所以,我不能使用预准备语句(假设至少我们知道WHERE子句中的字段)。这就是为什么准备好的语句不可避免的问题,我必须用普通的旧生成的SQL来做。
我可以采取哪些措施来保护应用程序免受SQL注入(REGEX方式或任何其他方式)?
答案 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子句,但使用参数名称来执行。