Я только что установил плагин FindBugs для Eclipse, надеясь, что он поможет мне найти уязвимости SQL-инъекций в моем коде. Тем не менее, он, похоже, ничего не находит, даже когда я сознательно кладу что-то в него.
В следующих примерах предположим, что staticFinalBaseQuery
объявлено следующим образом:
public static final String staticFinalBaseQuery = "SELECT foo FROM table, где id = '";
и предположим, что userInputfilterString
является аргументом метода, обертывающего фрагменты примера. Он поступает непосредственно от пользователя и не очищается.
Например, следующий фрагмент не вызовет предупреждение:
String query = staticFinalBaseQuery + userInputfilterString;
pstmt = dbConnection.prepareStatement(query);
Где staticFinalBaseQuery
- это конечная статическая строка, а userInputfilterString
- строка непосредственно из пользовательского ввода, доступная только во время выполнения, без очистки. Понятно, что это уязвимость.
Я ожидаю, что " Подготовленный оператор генерируется из предупреждения неконстантной строки ", чтобы сработать.
Следующий фрагмент также не вызывает предупреждения (что неудивительно, поскольку скомпилированные формы, вероятно, идентичны):
pstmt = dbConnection.prepareStatement(staticFinalBaseQuery + userInputfilterString);
Однако это вызовет предупреждение:
pstmt = dbConnection.prepareStatement(staticFinalBaseQuery + userInputfilterString + "'");
Если я добавляю пустую строку или пробел, предупреждение не выдается.
Итак, мой вопрос, как я могу получить FindBugs для запуска в моем первом примере? Мне также любопытно , почему первое не вызывает предупреждение, а последнее вызывает?
Заранее спасибо!
EDIT : я отправил ошибку в систему отслеживания ошибок FindBugs, так как кажется, что это может быть ошибкой. Однако, если у кого-нибудь есть какие-либо советы, я бы с удовольствием их услышал.