Java Veracode 扫描 - SQL 注入的误报
Posted
技术标签:
【中文标题】Java Veracode 扫描 - SQL 注入的误报【英文标题】:Java Veracode Scan - False Positive on SQL Injection 【发布时间】: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 在修改代码后会漏掉问题。无论如何,感谢您的帮助 - 知道“不存在可行的解决方案”总比不知道要好;-)。
如果代码是动态的,规则也是动态的 :) 如果您允许代码更改而不重置规则,显然会有问题。工具故障需要由工具公司修复(前提是顾问没有任何其他解释:))而不是开发人员,所以我不认为这是您的担忧。
【参考方案1】:
在这种情况下,一种解决方法是将 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 注入,这对我来说很有意义,因为现在你不能在你的方法中使用 any sql,只有你认识的一个。
【讨论】:
以上是关于Java Veracode 扫描 - SQL 注入的误报的主要内容,如果未能解决你的问题,请参考以下文章
VeraCode 报告 ServiceStack OrmLite 对 SQL 命令中使用的特殊元素进行了不当中和(“SQL 注入”)(CWE ID 89)