SonarQube默认不报SQL注入是因为Java安全规则(如sonar.java.rule.jdbc=security)被关闭,必须显式启用并确保字节码路径、源码上下文和规则激活三者齐备,否则Statement.executeUpdate("UPDATE t SET v = " + input)等代码将静默通过。

SonarQube 默认不报 Statement.executeUpdate("UPDATE t SET v = " + input) 这类代码,不是它没能力,而是 Java 安全规则(比如 sonar.java.rule.jdbc=security)根本没开——关着的状态下,所有 JDBC 拼接、@Query("" + name)、${table} 都静默通过。
为什么 executeUpdate("UPDATE t SET v = " + input) 一直不告警?
因为 SonarQube 把 quality 和 security 规则完全隔离,JDBC 相关的 SQL 注入检测全部压在 sonar.java.rule.jdbc=security 这个开关上。没显式启用,等于没加载模块。
-
sonar.java.rule.jdbc=security没配 → 字符串拼接 SQL 直接跳过 -
sonar.java.binaries=target/classes路径错或缺失 → AST 分析跑不起来,所有 Java 安全规则失效 -
sonar.sources=src/main/java指向不准 →@Query("SELECT * FROM u WHERE name = '" + name + "'")因上下文丢失而漏检
GitLab CI / Jenkins 中 sonar-scanner 必须配对的三个硬性参数
SonarScanner 5.0+ 对 sonar.java.rule.* 类配置有硬限制:不支持命令行 -D 方式传参。错放位置 = 白配。
- GitLab CI:必须用
sonar-project.properties文件,或通过环境变量SONAR_SCANNER_OPTS="-Dsonar.java.rule.jdbc=security -Dsonar.java.rule.hql=security" - Jenkins Pipeline:
withSonarQubeEnv块内必须显式声明sonar.java.binaries=target/classes,否则无字节码,AST 分析中断 - Maven 多模块:父 POM 配了
sonar-maven-plugin,但子模块未声明sonar.language=java,会 fallback 到通用解析器,跳过 Hibernate/JPA 语义识别
PR/MR 评审时怎么真正“卡住”不安全代码?
只标红问题不够,必须绑定质量门禁(Quality Gate)强制拦截。SonarQube 不会自动拒绝合并,得靠规则 + 门禁双触发。
- 进后台创建/编辑 Quality Gate,加条件:
Blocker issues > 0或New Blocker issues on new code > 0 - CI 流水线执行
mvn sonar:sonar后,必须调用waitQualityGate()等待分析完成 - PR/MR 页面会自动显示门禁状态;未通过则 Merge 按钮禁用,日志明确提示
SQL injection detected
注意:sonar.java.rule.jdbc=security 启用后,连 final String sql = "SELECT * FROM " + table; 这种看似受控的拼接也会告警——SonarQube 不追踪变量来源,它只认字符串拼接行为本身。这点容易被当成误报忽略,但恰恰是它防止未来维护引入风险的设计逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











