声纳抱怨一种方法:
“准备好的语句由非常量字符串生成”
我理解,通过字符串连接来参数化查询是不安全的,但是这里我定义了表的名称。如何消除声纳警告?更重要的是,如何解决这个问题,如何避免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;
}谢谢你的帮助。
发布于 2014-04-15 18:32:09
声纳警告准确地说明了它所警告的内容:
“准备好的语句由非常量字符串生成”
这并不意味着您的代码容易受到SQL注入攻击。这仅仅意味着它可能是。如果您绝对确信用户无法注入数据库模式或表名,那么只需忽略警告即可。
https://stackoverflow.com/questions/23091574
复制相似问题