Findbugs не находят потенциальную уязвимость SQL-инъекций - PullRequest
5 голосов
/ 29 декабря 2008

Я только что установил плагин 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, так как кажется, что это может быть ошибкой. Однако, если у кого-нибудь есть какие-либо советы, я бы с удовольствием их услышал.

Ответы [ 3 ]

2 голосов
/ 30 декабря 2008

Здесь трудно различить безопасный код и небезопасный код. Конечно, userInputfilterString может быть небезопасным, но это невозможно определить во время компиляции. Однако символ одинарной кавычки в конкатенации строк является контрольным признаком использования кода, способного к инъекции. Вот почему FindBugs запускается в строке, содержащей этот символ, но не в строке с простой конкатенацией строк.

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

1 голос
/ 07 марта 2009

Не думаю, что PMD или Checkstyle тоже поймают его, но вы можете попробовать их (я использую все 3 на регулярной основе, хорошие инструменты для использования) .

РЕДАКТИРОВАТЬ: PMD была правильная ссылка, но я назвал это findbugs ... findbugs в мозгу, я думаю ...

0 голосов
/ 18 апреля 2009

Подумайте об обновлении до коммерческого программного обеспечения, такого как http://www.ouncelabs.com/, которое будет намного лучше соответствовать вашим целям ...

...