Ложные срабатывания для SQL-инъекций от find-sec-bugs

Мы используем find-sec-bugs с findbugs, чтобы найти потенциальные проблемы в нашем коде. Мы используем Spring JDBCTemplate для доступа к БД, и find-sec-bugs кажется, что у нас повсюду есть уязвимости в SQL-инъекциях. Простейший пример выглядит следующим образом:

public class MyDataRepo {
    private final String getDataSql;

    public PilotRepositoryImpl(DataSource dataSource) {
        jdbcTemplate = new JdbcTemplate(dataSource);
        getDataSql = "SELECT ID, FIRST_NAME, LAST_NAME, USERNAME, EMAIL FROM USERS WHERE COMPANY_ID = ? AND ID = ?";
        //...
    }

    public MyData getMyData(String companyId, UUID userId)
    {
        return jdbcTemplate.queryForObject(getDataSql, new Object[]{companyId, userId}, myDataRowMapper);
    }
}

Это приводит к тому, что он думает, что уязвим для SQL-инъекций, чего явно нет (пожалуйста, исправьте меня, если я ошибаюсь).

Если я скопирую и вставлю строку прямо в метод, как это:

return jdbcTemplate.queryForObject("SELECT ID, FIRST_NAME, LAST_NAME, USERNAME, EMAIL FROM USERS WHERE COMPANY_ID = ? AND ID = ?", new Object[]{companyId, userId}, myDataRowMapper);

тогда он думает, что все в порядке. Мне нравится, когда SQL определяется в начале моего класса, а не скрывается в каждом методе. Я не хочу добавлять @SuppressFBWarnings везде, так как это в значительной степени побеждает цель.

Есть ли лучший способ обойти это? Что-то не так с тем, что мы делаем?

2 ответа

Код безопасен. ФСБ не распознает в данный момент, что поле чтения является окончательным, и его источник был безопасным.

Этот ложный положительный результат будет в конечном итоге проигнорирован, когда эта проблема будет исправлена: https://github.com/find-sec-bugs/find-sec-bugs/issues/385.

Мне нравится, когда SQL определяется в начале моего класса, а не скрывается в каждом методе.

Попробуйте использовать статический метод вместо поля.

public class MyDataRepo {

    private static String getDataSql() {
        return "SELECT ID, FIRST_NAME, LAST_NAME, USERNAME, EMAIL FROM USERS WHERE COMPANY_ID = ? AND ID = ?"
    }

    public PilotRepositoryImpl(DataSource dataSource) {
        jdbcTemplate = new JdbcTemplate(dataSource);
        //...
    }

    public MyData getMyData(String companyId, UUID userId) {
        return jdbcTemplate.queryForObject(getDataSql(), new Object[]{companyId, userId}, myDataRowMapper);
    }
}

Это приводит к тому, что он думает, что уязвим для SQL-инъекций, чего явно нет (пожалуйста, исправьте меня, если я ошибаюсь)

Я не согласен, но более широкий охват может предложить больше векторов атаки.

Другие вопросы по тегам