Ложные срабатывания для 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-инъекций, чего явно нет (пожалуйста, исправьте меня, если я ошибаюсь)
Я не согласен, но более широкий охват может предложить больше векторов атаки.