[英]Java Veracode Scan - False Positive on SQL Injection
我们在 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 不那么偏执?
在这种情况下,一种解决方法是将 sql 的标识符(例如枚举)传递给方法而不是 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,只有你认识的一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.