【发布时间】:2019-05-01 13:08:43
【问题描述】:
我们在 Java 代码中得到“CWE-89:SQL 命令中使用的特殊元素的不当中和('SQL 注入')”:
private static void doSomethingWithDB(int queryFetchSize, String sql, Object... params)
try {
Connection connection = ...
PreparedStatement statement = connection.prepareStatement(sql);
statement.setFetchSize(queryFetchSize);
for (int i = 0; i < params.length; i++) {
statement.setObject(i + 1, params[i]);
}
ResultSet resultSet = statement.executeQuery(); //this is where Veracode reports error
....
从外部传递 SQL 不是最佳设计实践,但在这种特殊情况下是可以的(方法是私有的,SQL 查询在我们的控制之下)。
在这种情况下,我怎样才能让 Veracode 不那么偏执?
【问题讨论】:
-
你说的从外面是什么意思?谁在构造这个
String sql并且在构造这个查询时是否有任何用户输入 或不受信任的来源?方法为private或public与SQL 注入无关。 -
by from outside 我的意思是通过一些间歇性方法从其类外部调用此方法,例如 public static void fetchFromDB(String sql, Object... params) -> doSomethingWithDB (queryFetchSize, sql, 参数);查询被构造为字符串常量(private static final String),没有用户输入或不受信任的来源
-
您需要与您的 VeraCode 顾问会面或调整规则以忽略此错误。我经历过很多误报,通常会在与规则会面后将例外添加到规则中。
-
好吧,“tweak rules”又名“add exception to rules”意味着 Veracode 在修改代码后会漏掉问题。无论如何,感谢您的帮助 - 知道“不存在可行的解决方案”总比不知道要好;-)。
-
如果代码是动态的,规则也是动态的 :) 如果您允许代码更改而不重置规则,显然会有问题。工具故障需要由工具公司修复(前提是顾问没有任何其他解释:))而不是开发人员,所以我不认为这是您的担忧。
标签: java sql-injection veracode