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 并且在构造这个查询时是否有任何用户输入不受信任的来源?方法为privatepublic 与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)

在我将解决方案作为 OWAPS 和 Roslyn 安全卫士的建议应用后,Veracode 仍然报告操作系统命令注入问题

SQL注入漏洞扫描工具都有哪些

SiteLock SQL 注入和 XSS 扫描失败

sqlmap可以扫描注入点吗

ASP网站被扫描有注入点,该怎么办?如何解决!