Sonar PreparedStatement - sql注入

Posted

技术标签:

【中文标题】Sonar PreparedStatement - sql注入【英文标题】:Sonar PreparedStatement - sql injection 【发布时间】:2014-05-30 06:30:35 【问题描述】:

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】:

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

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

这并不意味着您的代码容易受到 SQL 注入攻击。这只是意味着它可能是。如果您绝对确定用户无法注入数据库架构或表名,则只需忽略警告即可。

【讨论】:

以上是关于Sonar PreparedStatement - sql注入的主要内容,如果未能解决你的问题,请参考以下文章

sonar7的介绍

sonar8.5.0升级为sonar8.5.3之后为啥很卡?

Sonar以Sonar默认语言环境之外的其他语言显示违规消息

高版本sonar安装遇到的坑-sonar 6.7.5

使用sonar分析代码会泄露吗

sonarQubeJenkins 集成 Sonar