Java Veracode扫描-SQL注入时误报

时间:2018-11-29 12:55:33

标签: java sql-injection veracode

在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减少偏执狂?

1 个答案:

答案 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,只能识别一个。