инструмент для обнаружения непараметризованного sql в коде java jdbc - PullRequest
1 голос
/ 05 декабря 2008

Я хочу проверить операторы SQL в коде Java / jdbc, чтобы убедиться, что выполняемый SQL имеет приемлемое качество. Похоже, что ни PMD, ни Findbugs не имеют правил JDBC или sql. Я мог бы использовать p6spy для входа в SQL и посмотреть на это, но это руководство.

Мне интересно, есть ли стратегия использования PMD / Findbugs / etc для создания правила, согласно которому любая строка, переданная в PreparedStatement, где есть "=" или "in", имеет только параметризованные переменные на стороне сравнения.

Кто-нибудь делал это? Или сделали это другими способами?

Ответы [ 2 ]

1 голос
/ 05 декабря 2008

Это сложная проблема. В некоторых случаях такие операторы сравнения, как = и IN(), но также: != <> < <= > >= LIKE.

Как вы определяете случаи интерполяции переменных приложения как литералов в выражениях?

String sql = "SELECT *, " + someJavaVar + " AS constant_column FROM mytable";

Вы можете искать SQL, содержащий разделители строк, но SQL-инъекция происходит не только от интерполяции строковых литералов.

Как бы вы охарактеризовали случаи интерполяции переменных приложения как вещи, отличные от значений данных?

String sql = "SELECT * FROM mytable ORDER BY " + columnname;

Я не знаю ни одного автоматического способа обнаружения недостатков SQL-инъекций. Проверка кода - более эффективный способ обнаружить их. В каждом операторе SQL, который содержит интерполированные переменные приложения, вы должны подтверждать, что переменные приложения являются «безопасными» и что ваше приложение явно проверило их или преобразовало так, чтобы они не содержали опасной полезной нагрузки.

0 голосов
/ 04 июня 2009

У вас есть возможность полностью протестировать приложение с подключенным к нему отладчиком?

Установите точку останова в реализации вашего Connection.createStatement () вашего драйвера JDBC и запустите приложение ... (или, если вы используете драйвер, для которого у вас нет исходного кода, напишите поддельный драйвер, который просто делегирует вызовы реальный и зарегистрируйте все экземпляры createStatement ())

...