SonarQube 误报 SQL 注入

SonarQube false positive SQL injection

提问人:DodgyCodeException 提问时间:11/29/2022 更新时间:11/30/2022 访问量:524

问:

我有一个查询,其确切值取决于几个输入参数。它看起来有点像这样:

final String otherColumns = includeExtras ? ", baz" : "";
final String otherRestriction = name.equals("fred") ? " and bar = baz" : "";
PreparedStatement stmt = conn.prepareStatement(
        "select foo, bar" + otherColumns + "from t where x = y" + otherRestriction);

SonarQube 报告说,这容易受到 SQL 注入的影响,但实际上很明显,所有“注入”都来自源代码,而不是直接来自参数,因此不存在漏洞。

是否有标志或设置可以让 SonarQube 花费更多时间进行数据流分析,以便它可以看到这里没有漏洞?

java jdbc sonarqube sql 注入

评论

0赞 Mick Mnemonic 11/30/2022
您是否尝试过重构代码,以便将查询提取到变量中?final String

答:

1赞 Djordje Nedovic 11/29/2022 #1

引发 SQL 注入规则是因为未使用参数化查询。

在这里,您可以找到有关它的更多详细信息。

评论

2赞 DodgyCodeException 11/29/2022
谢谢,但这行不通,因为如果没有其他列,则无效的 SQL 语法。此外,otherRestriction 的参数占位符会使语句无效。SQL 参数化语句不能在任何地方使用“?”。它们只能进入某些地方,即值会去的地方。它们不能用于添加关键字(这是包含的内容)。select foo, bar, from totherRestrictions
0赞 Djordje Nedovic 11/30/2022
嗨,@DodgyCodeException,感谢您的评论。你是对的,我上面的解决方案并不完全正确。在这种情况下,解决方案是使用大量 if-else 块。如果你愿意,我可以在今天晚些时候更新答案。
0赞 DodgyCodeException 11/30/2022
没关系,我知道有很多 if-else 块会是什么样子。我的主要疑问是是否可以让 SonarQube 理解没有威胁,这样我就可以避免在代码中出现大量 if-else 块。无论如何,感谢您的回答。
1赞 Djordje Nedovic 11/30/2022
@DodgyCodeException完美,我将删除代码,这样就不会混淆任何人。