Java Veracode扫描-SQL注入错误



我们在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查询在我们的控制之下(。

在这种情况下,我如何才能让维拉科德不那么偏执?

在这种情况下,一种解决方法是将sql的标识符(例如enum(传递给方法,而不是sql本身,然后将此标识符映射到方法体中的实际sql。所以示例代码想要这样的东西:

private static void doSomethingWithDB(int queryFetchSize, SqlName sqlName, Object... params)
try {
Connection connection = ...
PreparedStatement statement = connection.prepareStatement(SqlMap.get(sqlName));
statement.setFetchSize(queryFetchSize);
for (int i = 0; i < params.length; i++) {
statement.setObject(i + 1, params[i]);
}
ResultSet resultSet = statement.executeQuery();
....

SqlName是表示预定义sql的枚举,而SqlMap则是在其他地方定义的枚举键映射,包含实际的sql。有了这个解决方案,Veracode就不再抱怨sql注入了,这对我来说很有意义,因为现在你不能在你的方法中使用任何sql,只有一个你能识别的。

最新更新