Sonar抱怨一种方法:
“准备好的语句是从非常量字符串生成的”
据我所知,通过字符串连接来参数化查询是不安全的,但在这里我定义了表的名称。 如何摆脱声纳警告?更重要的是,如何解决这个问题,如何避免sql注入? 我应该开始在db和节点变量中搜索无效值,例如。不得包含空格或; (通常检查输入的东西),还是有优雅的方式?
顺便说一句,这个方法在应用程序中非常深入,我怀疑是否有可能通过ui强制对这些参数赋值。
方法的简化版本:
private PreparedStatement getPs(Connection conn, String db, String node, String ext) {
StringBuilder sql = new StringBuilder("select name, sum(counter) cnt");
sql.append(" from ").append(db).append(".").append(node).append("_stuff");
sql.append(" where something = ?");
sql.append(" group by name");
PreparedStatement ps;
try {
ps = conn.prepareStatement(sql.toString());
ps.setString(1, ext);
} catch (SQLException sqle) {
throw new MyRuntimeException(sqle);
}
return ps;
}
感谢您的帮助。
答案 0 :(得分:2)
声纳警告准确地说明了它所警告的内容:
“准备好的语句是从非常量字符串生成的”
这并不意味着您的代码容易受到SQL注入攻击。这只是意味着可以。如果您完全确定用户无法注入数据库模式或表名,那么只需忽略该警告。