在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减少偏执狂?
答案 0 :(得分:0)
在这种情况下,一种解决方法是将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,只能识别一个。