Sonar PreparedStatement - sql注入

时间:2014-04-15 18:27:13

标签: java prepared-statement sql-injection sonarqube

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;
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

声纳警告准确地说明了它所警告的内容:

  

“准备好的语句是从非常量字符串生成的”

这并不意味着您的代码容易受到SQL注入攻击。这只是意味着可以。如果您完全确定用户无法注入数据库模式或表名,那么只需忽略该警告。